关系数据库设计(使用MySQL)

关系数据库设计(使用MySQL),mysql,database,database-design,relationship,Mysql,Database,Database Design,Relationship,最近,我试图设计一个关于“用户关系”的数据库解决方案——每个用户都有朋友,每个朋友都有一个权限(权限描述了他们之间关系的隐私级别)。我是MySQL程序的新手,以下是我的两个数据库设计: 设计1:数据库有一个“用户表”,描述所有用户的基本信息,如用户id、年龄、电子邮件,和每个用户都有一个“friends\u table”,“friends\u table”包含朋友的用户id(可以查询朋友的信息),每个“friend\u table”都可以通过其存储在“user\u table”中的表名进行查询(

最近,我试图设计一个关于“用户关系”的数据库解决方案——每个用户都有朋友,每个朋友都有一个权限(权限描述了他们之间关系的隐私级别)。我是MySQL程序的新手,以下是我的两个数据库设计:

设计1:数据库有一个“用户表”,描述所有用户的基本信息,如用户id、年龄、电子邮件,和每个用户都有一个“friends\u table”,“friends\u table”包含朋友的用户id(可以查询朋友的信息),每个“friend\u table”都可以通过其存储在“user\u table”中的表名进行查询(每个friends\u table的名称是唯一的)

设计2:数据库有一个“用户表”和一个“关系表”。“关系表”描述了所有用户的关系

user_table                          relationship_table
+------------------------+          +------------------------+
| user_name(primary key) |          |     id(primary key)    |
+------------------------+          +------------------------+
|        password        |          |        user_name       |
+------------------------+          +------------------------+
|          email         |          |       friend_name      |
+------------------------+          +------------------------+
|         ....           |          |        authority       |
+------------------------+          +------------------------+
|         ....           |          |          ....          |
+------------------------+          +------------------------+
基于design 2,一个名为Jim的用户有4个朋友Lisa、Tom、Jerry和Johnny,tbales展示如下:

user_table            
+-----------+-----------+---------------+
| user_name | password  |      email    |
+-----------+-----------+---------------+
|    Jim    |   *****   |  Jim@mail.com |
+-----------+-----------+---------------+
|   LiLei   |   *****   |  LiLei@gl.com |
+-----------+-----------+---------------+
|   ....    |   *****   |     ....      |
+-----------+-----------+---------------+
|   ....    |   *****   |     ....      |
+-----------+-----------+---------------+

relationship_table            
+-----------+-----------+---------------+---------------+
|     id    | user_name |  friend_name  |   authority   |
+-----------+-----------+---------------+---------------+
|     1     |    Jim    |      Lisa     |     ***       |
+-----------+-----------+---------------+---------------+
|     2     |    Jim    |      Tom      |     ***       |
+-----------+-----------+---------------+---------------+
|     3     |    Jim    |     Jerry     |     ***       |
+-----------+-----------+---------------+---------------+
|     4     |    Jim    |     Johnny    |     ***       |
+-----------+-----------+---------------+---------------+
|     5     |    Qing   |      Jim      |     ***       |
+-----------+-----------+---------------+---------------+
|     6     |    Feng   |      Tom      |     ***       |
+-----------+-----------+---------------+---------------+
|     7     |    Guang  |      Tom      |     ***       |
+-----------+-----------+---------------+---------------+
如果我想查询Jim的朋友,我使用SQL命令:

 select friend_name from relationship_table where user_name='Jim';

考虑到数据库性能,这两种设计哪一种更好?或者存在更好的设计?

基本上,即使朋友也是用户(假设),因此将所有人添加到一个表中

所以基本的表格是

UserTable(用户ID、用户名[主键]、密码、电子邮件等) UserID-->只是一个简单的自动递增数字

AuthorityTable(AuthorityID、Authority\u名称、权限等) AuthorityID-->只是一个简单的自动递增数字

UserRelationShipTable(URID、UserID、FriendsWith、AuthorityID)

URID-->只是一个简单的自动递增数字 UserID-->这里是UserTable中的外键 FriendsWith-->也是类似于Friends的用户ID AuthorityID-->AuthorityTable中的外键


搜索“嵌套集模型”设计1甚至不是一个选项
 select friend_name from relationship_table where user_name='Jim';