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

Posted

技术标签:

【中文标题】关系数据库设计(使用 MySQL)【英文标题】:A relationship database design (using MySQL) 【发布时间】:2016-03-29 09:16:05 【问题描述】:

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

设计1:数据库有一个“user_table”,描述了所有用户的基本信息,例如user_id、年龄、电子邮件...,并且每个用户都有一个“friends_table” ", "friends_table" 包含好友的user_id(可以查询好友的信息),每个"friend_table" 可以通过"user_table" 中存储的表名来查询(每个friend_table的名称是唯一的)。

user_table
+------------------------+
| user_name(primary key) |
+------------------------+
|        password        |
+------------------------+
|          email         |
+------------------------+
|         ....           |
+------------------------+
|         ....           |             friend_table
+------------------------+ ----------> +------------------------------+
|    friend_table_name   |             |          id(primary key)     |
+------------------------+             +------------------------------+
                                       |          user_name           |
                                       +------------------------------+
                                       |          authority           |
                                       +------------------------------+
                                       |             ....             |
                                       +------------------------------+

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

user_table                          relationship_table
+------------------------+          +------------------------+
| user_name(primary key) |          |     id(primary key)    |
+------------------------+          +------------------------+
|        password        |          |        user_name       |
+------------------------+          +------------------------+
|          email         |          |       friend_name      |
+------------------------+          +------------------------+
|         ....           |          |        authority       |
+------------------------+          +------------------------+
|         ....           |          |          ....          |
+------------------------+          +------------------------+

基于设计 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';

考虑到数据库性能,这两种设计哪个更好?还是有更好的设计?

【问题讨论】:

搜索“嵌套集模型” 设计 1 甚至不是一个选项 【参考方案1】:

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

所以基本表将是

UserTable (UserID,user_name[primary key],password,email, .... ) UserID--> 只是一个简单的自动递增编号

AuthorityTable(AuthorityID,Authority_name,Permission,....) AuthorityID--> 只是一个简单的自动递增编号

UserRelationShipTable (URID,UserID,FriendsWith,AuthorityID)

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

【讨论】:

以上是关于关系数据库设计(使用 MySQL)的主要内容,如果未能解决你的问题,请参考以下文章

MySQL中的分层关系数据库设计

关系数据库设计(MySQL)

MySQL数据库8表关系

关系数据库(MySQL)的规范化以及设计原则

关系数据库设计(MySQL)

mariadb(mysql)基本介绍