Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.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_Sql_Foreign Keys - Fatal编程技术网

MySQL:如何避免需要孤立行的情况?

MySQL:如何避免需要孤立行的情况?,mysql,sql,foreign-keys,Mysql,Sql,Foreign Keys,我目前正在构建一个系统,用户可以将他们创建的内容标记为公共或私人内容。我想限制一些用户只创建公共内容或私人内容,并允许其他人选择 为了避免使用ENUM作为数据类型,我有一个包含两行的types表:public和private。我还有一个允许的表,它接受一个userid和一个typeid。例如: table: users; columns: id, username table: types; columns: id, name table: allowed; columns: userid, t

我目前正在构建一个系统,用户可以将他们创建的内容标记为公共或私人内容。我想限制一些用户只创建公共内容或私人内容,并允许其他人选择

为了避免使用ENUM作为数据类型,我有一个包含两行的types表:public和private。我还有一个允许的表,它接受一个userid和一个typeid。例如:

table: users; columns: id, username
table: types; columns: id, name
table: allowed; columns: userid, typeid
在这些表格中,我可能有以下记录:

users: [ 1, me ]
types: [ 1, public ], [ 2, private ]
allowed: [ 1, 2 ]
因此,me用户只能创建私有内容

这一切都很好,因为这样我就可以在内容表中使用外键来限制它们的内容设置

table: content; columns: id, userid, typeid, content
[ content.userid, content.typeid ] references [ allowed.userid, allowed.typeid ]

content: [ 1, 1, 2, "some text" ]
但是现在,一年后,我决定我现在只能创建公共内容。因此,我可以从me用户允许的表中删除该行,并创建一个新的行:

delete from allowed: [ 1, 2 ]
insert into allowed: [ 1, 1 ]
问题是,我希望确保他们已经创建的私有内容保持私有,而只有新内容必须作为公共内容创建。从我的研究中可以看出,这只是一个称为孤立行的概念,听起来与此设计所需的功能类型完全相同,但MySQL根本不允许孤立行

维护数据完整性的最佳方法是什么?从概念上讲,保留外键并允许孤立行是完美的设计。我可以用PHP做一个if语句,但是我想找到一个纯粹的解决方案,如果有的话


您建议什么是设计此数据库的合适方法?

我不理解这个问题。内容表中有一个typeid列。它不会仅仅因为您更改了users表而更改—除非您有一个触发器强制执行问题中未描述的内容

但是,我建议使用类型2维度,而不是删除记录。基本上,它有一个eff_日期和end_日期,用于描述用户/类型组合有效的时间段。这将把typeid从users表中分离出来,将其放在UserTypes表中。此表将随时间推移在不同的时间点使用不同的类型平铺。

内容应引用用户和类型表,而不是允许的表。外键约束主要用于维护数据完整性,而不是强制执行安全性/权限

作为旁注,我会在用户表中有两个标志can_create_public和can_create_private;除非你打算创造新的类型…半公开?有一张桌子放可能太过分了。在这种情况下,内容将只有一个私有标志


我可以看到一些场景,其中您可能需要一个扩展的类型列表,但这将是一个更加复杂的用户组访问权限场景,其中组将是类型。

触发器呢?不够纯粹?我已经考虑过了,但我想让这些类型继续扩展。起初,我曾考虑将其作为另一种类型进行保护,但后来决定我不想这样做。但是,如果有扩展的能力,我可以稍后再添加。不过,我明白你关于诚信与授权的观点。我认为if语句是合适的方式。谢谢你的提示!