这类数据的最佳数据库设计是什么?

时间:2010-08-10 12:51:02

标签: php mysql database

我有一个用户表,

每个USR_ID可以有多个角色,视图,品牌和单位。

所以我想到的最佳设计就是:

Users
USR_ID    USR_Username    USR_Password

Matrix
M_ID    M_USR_ID    M_ROLE_ID    M_VIEW_ID    M_BRAND_ID    M_UNIT_ID

_ROLES
ROLE_ID    ROLE_Name    ROLE_Active

_VIEWS
VIEW_ID    VIEW_Name    VIEW_Active

_BRANDS
BRAND_ID    BRAND_Name    BRAND_Active

_UNITS
UNIT_ID    UNIT_Name    UNIT_Active

所以基本上在Matrix表中我保留了关于哪个用户做了什么的所有数据。

我的问题是,最佳结构和设计是什么?更进一步说,Matrix表中的行怎么样? 这是一个有ROLE_ID = 1

的人的例子
Matrix
1    30    1    4    7    2    4

现在我想为那个人添加另一个ROLE,下一行会是什么样子?我是否保留所有其他定义(品牌,单位,视图......)的值?或者我只是插入除了ROLE_ID之外的所有NULL?

非常感谢您的协助,

谢谢,

2 个答案:

答案 0 :(得分:3)

我不会使用你的矩阵表。相反,请使用交叉引用表。

链接用户和角色:

User_Roles
USR_ID    ROLE_ID

跨每个表的参考表创建:角色,视图,品牌,单位。这样,您可以为多个单元创建多个单元,而无需将每个单元绑定到特定角色。您可以拥有三个单元,三个角色和三个品牌,而无需创建27个矩阵记录。

答案 1 :(得分:0)

(删除回复的开始,因为斯科特说它比我更快,更清楚地说了一分钟。)

对于您拥有的数据,矩阵设计过于平坦;你一定要考虑使用更规范化的设计。

你的问题不清楚的是角色/观点/品牌和单位之间是否有任何依赖关系。在设计表格时值得关注这一点 - 对于您的数据来说是一个愚蠢的例子:如果具有给定品牌的用户总是需要相同的单位,并且没有其他原因使用户拥有单位,那么您不需要将设备连接到用户,只需连接到品牌。但这是一个改进。

您的出发点绝对应该是Scott建议的设计:用户,角色,视图,品牌,单位和四个交叉引用表各一个表,用户将用户连接到其他四个。