数据库设计:我是否可以在表中创建一个列,只允许某些特定行为“true”而对于相同的特定行为“false”

时间:2012-01-02 07:33:11

标签: database sql-server-2008 database-design entity-framework-4.1

问题陈述 - [业务] 1 --- * [分支机构]企业必须拥有一个或多个分支机构。只有一个分支可以成为主分支。

我脑子里有两个设计

  1. [分支表] - {id,BusinessID(FK),名称等, IsMainBranch }
  2. [分支表] - {id,BusinessID(FK),名称等},[ MainBranch表] - {BranchID(PK,FK),BusinessID( FK)}。
  3. [商家信息表] - {id,name, mainbranchid },[分支表] - {id,BusinessID(FK),名称等}}
  4. 问题#1 - 要对IsMainBranch进行约束我必须使用触发器,后者可能会不同步。

    #2的问题 - 在EF中访问数据有点复杂。

    #3的问题 - 不要认为它是一个好的设计。

    我使用EF 4.1作为ORM并且不想让事情变得复杂,我应该选择哪种设计。请建议是否有更好的/替代方式。

3 个答案:

答案 0 :(得分:6)

使用SQL Server 2008+,您可以使用filtered indexes

Branch表格中,只有一个标记IsMainBranch。然后创建一个唯一的过滤索引:这将只允许每行IsMainBranch= 1一行。

分支表:

id (PK)
BusinessID (FK)
Name
...
IsMainBranch 

然后

CREATE UNIQUE INDEX IX_MainBranch 
        ON Branch(BusinessID) 
        WHERE IsMainBranch = 1;

这给出了

  • 更简单的表格结构
  • 没有触发器
  • 数据库引擎强制执行此操作
  • 没有循环FK(业务表中没有MainBranchID

另见:

答案 1 :(得分:0)

每个“卫星”分支都有一个主分支,对吗?那么为什么不拥有一个领域“主要分支”。如果branch id == main branch,那么 是一个主分支。否则,引用到主分支。

你应该有一个“isMainbranch”列。

“分支类型”列可能没问题:类型可能包括“main”,“satellite”,“ATM kiosk”等。但布尔值为“isMainBranch”?没有。

... IMHO

答案 2 :(得分:0)

我会选择3号,在商业表格中创建一个mainBranchId。

1)这将确保在任何给定时间每个企业最多有一个主要分支。 (这可能发生在其他2个设计中)

2)你不需要创建一个额外的表,它是分支表的复制(这是你在第二个设计中要做的)