Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 建立复杂用户交互数据库模型的最佳方法是什么?_Mysql_Database_Database Design - Fatal编程技术网

Mysql 建立复杂用户交互数据库模型的最佳方法是什么?

Mysql 建立复杂用户交互数据库模型的最佳方法是什么?,mysql,database,database-design,Mysql,Database,Database Design,在我的web应用程序中,我会有用户,每个用户都会有相册,每个用户也会有不同的用户,他们的权限与相册绑定。我不太清楚用一组以用户ID为前缀的表(即10384792_相册)对我的数据库建模是否更有效,或者我是否应该有一个包含一组数据的表(相册,其中包含用户ID)。我之前的例子是关于相册的,但相对而言,同样的事情也适用于用户的用户 请记住,相册本身可能有很多行数据,例如名称、描述、创建日期等。我使用的是MySQL和PHP。我想这更像是一个问题,我想指出好的设计概念,这是一个标量的概念,而不牺牲接收数据

在我的web应用程序中,我会有用户,每个用户都会有相册,每个用户也会有不同的用户,他们的权限与相册绑定。我不太清楚用一组以用户ID为前缀的表(即10384792_相册)对我的数据库建模是否更有效,或者我是否应该有一个包含一组数据的表(相册,其中包含用户ID)。我之前的例子是关于相册的,但相对而言,同样的事情也适用于用户的用户

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

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

听起来不错。 我想说你们的关系是这样的 usersTable->OneToMany->albumsTable->OneToMany->permissionsTable 然后permissionsTable->oneToMany->usersTable 这是基于密钥的基本规范化。 所有的东西都在pk上建立索引-除非你的连接更复杂,这将很好地记录到数百万条记录中。如果删除是计划的一部分,请制定索引优化策略,并确保所有内容都保留在内存中。 如果pk以外的元素在连接中,请查看索引permissionsTable(ie-pk,权限级别)。 你真的认为你需要更复杂的东西吗

如果您真的担心mysql中的滚雪球,请查看一个tcp代理,它将用作mysql前面的队列,因为它往往处理并发请求的能力相当差:请参见此处

建议您不要因为与之相关的开销而增加设计的复杂性。坚持经过考验的真理。

像这样的东西

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

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


您可以通过对客户端和用户记录的更多动态权限进一步扩展此功能,但这应该足够简单,可以让您继续。

您肯定不希望每个用户都有一个单独的表。David,回答得很好。非常感谢。但我可能应该提到,用户的用户实际上并不是由用户组成的(第一个表)。请参阅,此网站上的每个用户帐户都将能够为其特定帐户创建用户。例如,该网站上的每个用户都有一个登录屏幕供其用户使用。将其视为我们的用户拥有客户端,他们通过自己的表单登录。对不起,我可能应该解决这个问题…@Cerelarceny:如果你不想同时使用这两种东西,那会导致进一步的混乱。我喜欢将父级称为客户端,每个客户端可以有多个用户。我会更新答案……假设一个用户有多个客户端,这个模型还能工作吗?@Cerelarceny:这取决于你所说的“用户”和“客户端”是什么意思。我想在你的评论中,用户是客户端的父母。在我的设计中,客户端是用户的父级。您可以随意交换术语。只要确保你是一致的。另一方面,是否需要子对象具有多个父对象,父对象具有多个子对象?也就是说,客户和用户是多对多吗?@Cerelarceny:在这种情况下,我在答案中的第二个设计应该可以做到这一点(尽管您可以进一步修改它以满足您的需要)。如果您认为用户应该是父对象,而客户机应该是子对象,则可以简单地切换用户和客户机概念(其他表上的表名和外键名)。这一切都归结为这些术语对所代表的业务概念真正意味着什么。