数据库设计 : Could I make a column in a table only allows one 'true' for some specific rows and others false for same specific rows

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

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

我脑子里有两个设计

  1. [Branch table] - {id, BusinessID (FK), Name, etc , IsMainBranch}
  2. [Branch table] - {id, BusinessID (FK), Name, etc}, [MainBranch table] - {BranchID (PK, FK), BusinessID ( FK)}.
  3. [业务表] - {id, name, ma​​inbranchid}, [Branch table] - {id, BusinessID (FK),姓名等

#1 的问题 - 为了对 IsMainBranch 施加约束,我必须使用触发器,后者可能会不同步。

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

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

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

最佳答案

对于 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)

另见:

关于数据库设计 : Could I make a column in a table only allows one 'true' for some specific rows and others false for same specific rows,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8698449/

相关文章:

mysql - 将 MySQL 默认表引擎从 MyISAM 更改为 InnoDB

sql - 如何避免出现游标以及其他方法?

sql - 基于多个字段对集合中的记录进行排名

mysql - 外部GUID以满足mysql中的唯一约束

MySQL 触发器无法更新触发器分配到的同一个表中的行。建议的解决方法?

mysql - 无法通过多个连接获取正确的数据

php - 使用 PHP 根据 MySQL 表中的特定文本显示特定图像

sql - 正确计算 2 个日期范围之间的时间

database - 在归档表中添加外键约束

mysql - 如何在事件日志的一个 "activity"中存储(在 MySQL 中)多个更新?