关系数据库设计(使用 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)的主要内容,如果未能解决你的问题,请参考以下文章