我无法弄清楚如何构建数据库来模拟我想要做的事情。
我们举个例子,我有以下表User
和Group
他们都有以下列Id
和Name
现在,我有一个名为Item
的对象。可以将Item
分配给User
或Group
,但不能同时分配到Item
。将User
分配给无Group
和User
也是有效的。有没有办法在有意义的数据库中列出这个?我是否会被强制在记录插入上使用自定义约束,以检查逻辑(项目何时无法同时分配给Group
和id="private_menu_"
)是否有效?
我觉得我绝对不是第一个遇到这个问题的人,但我没有看到类似的问题。感谢。
对于上下文,我只是试图设计这个,所以我可以使用一个对我有意义的数据库模型,我最终将在C#中的实体框架中创建Code-First。我没有用它来标记它,因为它看起来不够相关。
答案 0 :(得分:1)
我认为处理它的一种方法是使用户和组成为一个实体,但使用flag属性定义,以告知它是用户还是组。因此,例如,创建一个名为Credentials
的表,您可以添加一个名为Type
的标志,该标志将设置为指示它是用户或组的值。这样,您可以在CredentialID
表中只有一个Item
字段,并验证它是否与Credentials
表中的记录匹配。您可能不希望以这种方式执行此操作,但可以考虑这一点。
如果您的Group
和User
表不简单,那么这是另一种查看它的方法,这可能是更好的解决方案。您可以将Group
表视为Credential
表。 Item
表中的每条记录只能链接到一个Group
。每个用户都有一个组,它是唯一的成员。如果需要,您可以在Group
表中用标记标记此记录,以便您的用户界面不会改变它,也可以让他们知道它是否真的是一个组,或者如果必要的话只是一个用户。这不仅消除了约束中的条件逻辑,而且消除了整个应用程序中的条件逻辑。项目只能链接到一个组,一个组链接到它的用户/用户。
答案 1 :(得分:0)
这是一种可以强制执行您在数据库级别描述的约束的方法。
像这样实施您的Item
表:
create table [dbo].[Item] (
pkid int identity primary key,
AssignedTo_UserId int null,
AssignedTo_GroupID int null,
constraint fk_User foreign key (AssignedTo_UserId) references [dbo].[User] (Id),
constraint fk_Group foreign key (AssignedTo_GroupID) references [dbo].[Group] (Id),
constraint user_xor_group check (not (AssignedTo_UserId is not null and AssignedTo_GroupID is not null))
);
您有两个分配字段,一个用于User
,另一个用于Group
。外键约束确保Item
无法分配给不存在的User
或Group
,并且检查约束确保只有AssignedTo_UserId
中的一个AssignedTo_GroupID
}或Item
曾经有一个非空值(即您的项目一次只分配给一个用户或组,而不是两者都分配。)
但是,桌面设计对我来说很有趣;它可能适合您的特定用例(无论可能是什么),但似乎不太可能。
如果您在同一列上描绘了两个互斥的外键约束,即表AssignedTo
有一个Id
列必须与Group
匹配User
}}或AssignedTo
,我不知道有任何方法可以做到这一点。 (您可以在引用不同表的相同列上有两个约束,但始终会应用它们,例如Group
必须与User
匹配{ {1}} 和 User
,这不是您要求的内容。
如果您的Group
和//= require jquery
//= require bootstrap-sprockets
//= require jquery_ujs
//= require turbolinks
//= require owl.carousel
//= require_tree .
表与它们看起来相似(即只有Name和Id列),那么@Brian's answer几乎肯定是要走的路。如果它们有很多不同的列,那么在您的数据库设计中可能存在对子类进行分类的争论,并且您希望完成设计的权衡并选择最符合您要求的那些。< / p>