在我的网络应用程序中,我将拥有用户,每个用户都将拥有相册,并且每个用户还将拥有与相册相关联的各种用户。我无法弄清楚用一堆以用户ID为前缀的表(即10384792_albums)来建模我的数据库是否更有效率,或者我是否应该有一个包含一堆数据的表(相册,其中包含一个用户的ID)。我之前的例子是关于专辑,但相对相同的事情将适用于用户的用户。
请记住,专辑本身可能会有很多行本身,例如名称,描述,创建日期等。我正在使用MySQL和PHP。我想这更像是一个问题,我希望在优秀设计概念的方式上指出,这是标量而不牺牲接收数据的速度。对不起,如果问题有点模糊,我真的不知道从哪里开始,任何帮助都将不胜感激。
编辑1:用户表的用户很有趣。可以这样考虑:对于本网站上的每个用户,他们都有自己独特的登录表单,客户可以访问特定的相册。客户端永远不会使用我网站用户所使用的相同表单登录我的网站。
答案 0 :(得分:2)
这样的东西?
User table
----------
ID (primary key)
Username
(more columns with more user info)
Album table
-----------
ID (primary key)
AlbumName
(more columns with more album info)
OwnerID (foreign key to User.ID)
AlbumPermission table
---------------------
ID (primary key)
AlbumID (foreign key to Album.ID)
UserID (foreign key to User.ID)
(more columns indicating permissions)
使用此布局,您可以将用户和相册作为实体,并将包含权限的表(多对多链接表)链接起来。 (此表也是一种元实体。本身它本质上毫无意义,但在用户或相册的上下文中,它包含有关用户可以访问的相册或可以访问该相册的用户的信息。)
每个相册都有一个用户作为其所有者,并且在AlbumPermission表中链接的零个或多个用户具有与之关联的各种权限。
修改强>
根据您对分层用户的评论,可能是这样的......
Client table
------------
ID (primary key)
ClientName
(more columns with more client info)
User table
----------
ID (primary key)
ClientID (foreign key to Client.ID)
IsAdmin (boolean)
Username
(more columns with more user info)
Album table
-----------
ID (primary key)
AlbumName
(more columns with more album info)
OwnerID (foreign key to User.ID)
AlbumPermission table
---------------------
ID (primary key)
AlbumID (foreign key to Album.ID)
UserID (foreign key to User.ID)
(more columns indicating permissions)
此处的不同之处在于添加了用户记录分组的客户端表。用户记录现在具有客户端记录的外键,以便每个用户只是一个客户端的成员(客户端到用户是一对多),并且IsAdmin
字段指示该用户是否是管理员 - 该客户的级别用户(即,能够为客户创建/修改用户记录)。
预计每个客户端至少拥有一个用户。在此设计中,它不一定需要,但在创建客户端(注册客户端的用户)时创建初始用户记录是有意义的。
您可以使用针对客户端和用户记录的更多动态权限进一步扩展此功能,但这应该很简单,足以让您前进。
答案 1 :(得分:0)
当然听起来不错。 我会说你的人际关系会是这样的 usersTable-> OneToMany-> albumsTable-> oneToMany-> permissionsTable 然后是permissionsTable-> oneToMany-> usersTable 这是基于密钥的基本规范化。 所有内容都在pk上编入索引 - 除非您的联接更复杂,可以很好地存储到数百万条记录中。如果删除是计划的一部分,请制定索引优化策略并确保所有内容都保留在内存中。 如果除了pk之外的元素在连接中,请查看索引permissionsTable(即-pk,权限级别)。 你真的认为你需要更复杂的东西吗?
如果你真的担心在mysql中滚雪球,请查看tcp代理作为mysql的队列,因为它倾向于处理并发请求而不是很好:请参阅http://flavio.tordini.org/a-more-stable-mysql-with-haproxy
建议您不要因为与之相关的开销而增加设计的复杂性。坚持经过考验的测试和真实。