在审查了许多DB设计之后,我仍然不确定什么是最好的方法。 我正在设计一个数据库,其中大多数实体具有不同的状态。例如,我可能有类似的东西
- 用户状态:活动、非活动、已禁用等。
- 订单状态:打开、关闭、已取消;
- 办公室状态:打开、关闭。
我想有两种不同的选择。
1( 为每个实体创建一个"状态"表
CREATE TABLE UserStatus(
UserStatusID int,
Description varchar(255)
);
CREATE TABLE OrderStatus(
OrderStatusID int,
Description varchar(255)
);
2( 为所有实体创建单个共享状态表
CREATE TABLE Status(
StatusID int,
Description varchar(255)
);
如果您能解释哪个选项更好或每个选项的优势,我将不胜感激
多个表有一个关键优势:您可以声明正确的外键关系,以确保引用表中的值正确。
单个表具有不同的优势:您可以在一个位置显示所有状态。 如果您需要执行诸如将所有状态翻译成其他语言之类的操作,这将非常方便。
在大多数情况下,我认为第一个优势大于第二个优势。 然而,在将来的情况下,第二个可能很重要。
另一个选项 - 为具有 EntityID 的所有实体创建单个共享状态表。 像这样:
CREATE TABLE dbo.Entity(
EntityID int NOT NULL
CONSTRAINT PK_Entity PRIMARY KEY CLUSTERED,
Name varchar(50) NOT NULL,
Description varchar(255) NULL,
)
CREATE TABLE dbo.Status(
EntityID int NOT NULL
CONSTRAINT FK_Status_Entity
FOREIGN KEY(EntityID) REFERENCES dbo.Entity (EntityID),
StatusID int NOT NULL,
Name varchar(50) NOT NULL,
Description varchar(255) NULL,
CONSTRAINT PK_Status PRIMARY KEY CLUSTERED (
EntityID ASC,
StatusID ASC)
CONSTRAINT UQ_Status_EntityID_Name UNIQUE NONCLUSTERED (
EntityID ASC,
Name ASC)
)