mysql - 对复杂用户交互的数据库建模的最佳方法是什么?

标签 mysql database database-design

在我的 Web 应用程序中,我将有用户,每个用户都有相册,每个用户也有不同的用户,这些用户具有与相册相关联的权限。我不太清楚用一堆以用户 ID 为前缀的表(即 10384792_albums)为我的数据库建模是否会更有效,或者我是否应该有一个包含一堆数据的表(albums,其中包含一个用户id)。我之前的例子是关于相册的,但相对来说,同样的事情也适用于用户的用户。

请记住,相册本身可能有很多数据行,例如名称、描述、创建日期等。我使用的是 MySQL 和 PHP。我想这更像是一个问题,我想指出良好的设计概念,即在不牺牲接收数据速度的情况下标量。抱歉,如果问题有点含糊,我真的不知道从哪里开始,我们将不胜感激。

编辑 1:用户表的用户很有趣。可以这样想:对于这个网站上的每个用户,他们都有自己独特的登录表单,他们的客户可以在其中访问特定的相册。客户永远不会使用我网站用户使用的相同表单登录我的网站。

最佳答案

是这样的吗?

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 字段,指示该用户是否是该客户的管理级用户(即,能够为该客户创建/修改用户记录)。

预计每个客户至少有 一个 用户。在此设计中不一定需要,但在创建客户端(正在注册客户端的用户)时创建初始用户记录是有意义的。

您可以通过对客户和用户记录的更多动态权限进一步扩展它,但这应该足够简单明了。

关于mysql - 对复杂用户交互的数据库建模的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9832963/

相关文章:

php - 如何在 php 中获取实时美元/印度卢比汇率?

mysql - 如何使用 TSQl 从文件夹读取文件并将文件名保存到表中?

mysql - 是否可以使用azure在线发布本地数据库?

mysql: show databases 不显示任何数据库

mysql - SQL schema优化,如何避免union?

mysql - 作为 MySQL root 用户 : how to switch to other user without password

database - 在 parse.com 上将性别保存为数字或字符串(以便更好地缩放)?

c# - 首先在 Entity Framework 代码中查询自定义类型

database - 数据库中的 GUID 类型

database - 6NF和历史属性数据