我目前正在构建一个系统,用户可以将自己创建的内容标记为公开或私有。我想限制某些用户只能创建公共内容或私有内容,并允许其他用户选择。
为了避免将ENUM用作数据类型,我有一个类型表,其中包含两行:“ public”和“ private”。我也有一个允许使用的表,其中包含一个用户ID和一个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 ]
因此,“我”用户只能创建私有内容。
一切都很好,因为我可以在内容表中使用外键来限制其内容设置。
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语句,但是如果有的话,我想找到“纯粹的”解决方案。
您会推荐什么是设计此数据库的合适方法?
最佳答案
content
应该引用users
和types
表,而不是allowed
表。外键约束主要用于维护数据完整性,而不是强制执行安全性/权限。
附带说明一下,我在用户表can_create_public
和can_create_private
中将只有两个标志。除非您打算创建一个新的types
(...“ semi-public”?),但要为其准备一张桌子可能是过大的选择。在这种情况下,content
仅具有一个private
标志。
我可以看到一些场景,在这些场景中,您可能需要扩展的“类型”列表,但这将是更为复杂的用户组访问权限场景,其中“组”就是类型。