用于将项目分配给用户或组的数据库结构,但不是两者

时间:2015-07-21 22:02:24

标签: sql-server database-design

我无法弄清楚如何构建数据库来模拟我想要做的事情。

我们举个例子,我有以下表UserGroup他们都有以下列IdName

现在,我有一个名为Item的对象。可以将Item分配给UserGroup,但不能同时分配到Item。将User分配给无GroupUser也是有效的。有没有办法在有意义的数据库中列出这个?我是否会被强制在记录插入上使用自定义约束,以检查逻辑(项目何时无法同时分配给Groupid="private_menu_")是否有效?

我觉得我绝对不是第一个遇到这个问题的人,但我没有看到类似的问题。感谢。

对于上下文,我只是试图设计这个,所以我可以使用一个对我有意义的数据库模型,我最终将在C#中的实体框架中创建Code-First。我没有用它来标记它,因为它看起来不够相关。

2 个答案:

答案 0 :(得分:1)

我认为处理它的一种方法是使用户和组成为一个实体,但使用flag属性定义,以告知它是用户还是组。因此,例如,创建一个名为Credentials的表,您可以添加一个名为Type的标志,该标志将设置为指示它是用户或组的值。这样,您可以在CredentialID表中只有一个Item字段,并验证它是否与Credentials表中的记录匹配。您可能不希望以这种方式执行此操作,但可以考虑这一点。

如果您的GroupUser表不简单,那么这是另一种查看它的方法,这可能是更好的解决方案。您可以将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无法分配给不存在的UserGroup,并且检查约束确保只有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>