有人建议我在项目中使用此处描述的表格,虽然我不能说为什么,但我认为这不是一个好主意。
MyTable(MyTableId PK,类型 INT NOT NULL,MyForeignKey INT NOT NULL)
MyForeignKey 可以根据 Type 的值指向各种表中的数据。当然,我们不能使用这样的模型来强制执行 FK 完整性,但是这个论点是否足以不使用它?
我会给你一个可以使用它的例子。假设您在系统中有一个 Notes 表来保存有关各种对象的注释;关于用户、文档等的注释。通常,我会这样建模:
注释(NoteId PK、Text VARCHAR(4000)、UserId INT NULL、DocumentId INT NULL、...)
我同事的建议是换一张这样的桌子:
注释(NoteId PK、文本 VARCHAR(4000)、ObjectType、ObjectId)
在第二个实现中,ObjectType 会告诉我们 ObjectId 是指向 Users 表还是 Documents 表中的一行。它的优点是如果我们想添加另一种类型的对象,数据库结构和代码需要的修改较少。
每种解决方案的优缺点是什么?
注意:我们永远不会拥有无数的对象类型。它应该保持在 10 以下。
事实上,我们的现实生活场景要复杂一些。它与权限系统有关,在该系统中,用户可能有权或可能无法访问各种类型的对象(文档、注释、事件等)
所以现在在我的数据库模型中,我有这些对象的表和其他表来建立它们与用户之间的关系(UserDocuments、UserNotes、UserEvents 等)。权限是通过这些链接表中的属性设置的。
我的同事提议使用一个单一的权限表,而不是像这样
权限(PermissionId PK、UserId INT、ObjectType、ObjectId、...其他权限字段...)
这是一个好主意吗?
另外,我们可以称之为 EAV 或 Open Schema 吗?这与我在这些主题上阅读的内容并不完全相同。