为在网站中注册的每个用户动态创建数据库表可能是解决此问题的解决方案


Creating a DB table dynamically for each user that signs up in a website, could be a solution for this?

只是出于好奇,因为它可以解决我的大部分问题,例如查询多个字段和比较多个表(意大利面纠缠(。它有多安全?这是不好的做法还是可以的。如果没问题 在安全方面要采取哪些预防措施。

问题在于 3 个表的关系:"用户"、"朋友"和"帖子"。

用户:

  • 编号
  • 名字
  • 姓氏
  • 电子邮件
  • 。等

朋友:

  • id(int(
  • 用户 ID1(整数(
  • 用户 ID2(整数(
  • friendship_requested_by(整数(
  • 接受(瓦尔查尔(
  • 已阻止(整数(
  • blocked_by(整数(
  • befriended_on(日期(

职位:

  • post_id(整型(
  • 用户 ID(整数(
  • post_text(文本(;
  • 。等

我在查询"朋友"TBL 时遇到问题,获取与登录用户成为朋友的用户 ID,因为有 2 个字段可以比较"user_id1"和"user_id2"然后按"desc"顺序从帖子中提取所有结果从帖子表中一直是一场噩梦,或者我一定在 mysql 中生疏了。我的快捷方式是,如果我可以为每个用户提供一个表/数据库,那么只有一个"friend_id"的朋友就会有一个表,我想会简单得多。

意大利面:

  function getPosts($email){
                 $myid = $this->getStudentId($email);
                 $sql = "SELECT DISTINCT user_id1 FROM friends
                        UNION 
                        SELECT DISTINCT user_id2 FROM friends
                       WHERE (user_id1 = ? AND accepted = ? AND blocked = ?)
                           OR (user_id2 = ? AND accepted = ? AND blocked = ?)";
                $query =  $this->db->query($sql,array($myid,'yes','no',$myid,'yes','no'));
                if($query->num_rows() > 0){
                    foreach ($query->result() as $r){
                           //echo "<br>my id1: ".$student_id1;
                         echo "<br> rows : ". $query->num_rows;
                         echo "<br> Amigos : ". $r->user_id1;
                          echo "<br> Amigos : ". $r->user_id2;
                        return $this->getPostByStudentId($r->user_id1,$r->user_id2);

                    }
                }

             }

function getPostByStudentId($student_id1,$student_id2){
             $this->db->where('user_id',$student_id1);
             $this->db->where('user_id',$student_id2);
             $this->db->order_by('post_id','desc');
             $sql = $this->db->get('posts');
             if($sql->num_rows() > 0){
                 return $sql->result();
             }
         }

提前谢谢。

不是一个好主意。随着数据库的增长,您最终的性能会越来越慢,因为当您需要跨多个表进行搜索时,索引速度并不快。

如果您最终需要获取大量用户信息(例如,您想要一份关于您有多少用户以及他们的电子邮件地址的报告(,突然之间,您将大量表(与您拥有的用户一样多(join在一起或进行数百个查询。

最好将所有

内容保存在较少的表中,并将数据逻辑地放在一起,而不是将用户逻辑地放在一起。

这可能看起来很诱人,但它是糟糕的数据库设计。

您需要了解数据库规范化。http://en.wikipedia.org/wiki/Database_normalization

问题是朋友表的互惠性质。 如果 Bob (UserID1( 是 Jim (UserID2( 的好友,那么 Jim(UserID1( 是否也应该有另一条记录,即 Bob(UserID2( 的好友。 现在您有两条记录,但至少您不必从两个字段中选择不同的记录。

我会重构数据库并将 friends 表替换为一个 frendship 表并删除用户 ID,然后有一个保存用户 ID 和 FrienshipID 的user_friendship桥表。 然后,您只需查询桥接表即可查找单个用户的所有友谊。