我正在研究制造数据库的一部分。该业务接受定制订单并根据规格构建项目。他们只构建了几种(比如说 3-10 种)类型的对象,但每种类型的对象在记录的规范中都是不同的。我想要一个主制造表 (mfgorders) 列出一些常见字段,然后让它引用特定于订购实体的规格表。我不完全相信这是正确的方法。事实上,我一点也不自信。我所有的其他建模都是直截了当的,但是这个让我很烦。
这是SQL:
CREATE TABLE dbo.mfgorders (MfgOrderId int NOT NULL
IDENTITY (1, 1) ,
OrderId int NOT NULL,
LineNbr tinyint NOT NULL,
MfgTypeId tinyint NOT NULL,
ItemDescription varchar (999) ,
ManufacturingCost smallmoney,
CONSTRAINT PK_mfgorders PRIMARY KEY (MfgOrderId)) ;
--OrderId + LineNbr are a composite referencing a row on a lineitem table (not depicted here)
CREATE TABLE dbo.mfgorders_entity1 (MfgOrderId int NOT NULL,
EntitySize decimal (5, 3) ,
Width decimal (4, 2) ,
Thickness decimal (4, 2) ,
CONSTRAINT PK_mfgorders_entity1 PRIMARY KEY (MfgOrderId)) ;
CREATE TABLE dbo.mfgorders_entity2 (MfgOrderId int NOT NULL,
Height decimal (5, 2) ,
Width decimal (5, 2) ,
Thickness decimal (4, 2) ,
RotationSetting decimal (4, 1) ,
FinishedHeight decimal (5, 2) ,
FinishedWidth decimal (5, 2) ,
FinishedThickness decimal (4, 2) ,
CONSTRAINT PK_mfgorders_entity2 PRIMARY KEY (MfgOrderId)) ;
CREATE TABLE mfg_types (MfgTypeId tinyint NOT NULL,
ItemName varchar (32) NOT NULL,
ItemDescription nvarchar (64) NULL,
IsActive bit NOT NULL
CONSTRAINT DF_mfg_types_IsActive DEFAULT 1,
SortOrder int NULL,
CONSTRAINT PK_mfg_types PRIMARY KEY (MfgTypeId)) ;
ALTER TABLE dbo.mfgorders_entity1 ADD CONSTRAINT FK_mfgorders_entity1_mfgorders FOREIGN KEY (MfgOrderId) REFERENCES dbo.mfgorders (MfgOrderId) ON UPDATE NO ACTION ON DELETE CASCADE;
ALTER TABLE dbo.mfgorders_entity2 ADD CONSTRAINT FK_mfgorders_entity2_mfgorders FOREIGN KEY (MfgOrderId) REFERENCES dbo.mfgorders (MfgOrderId) ON UPDATE NO ACTION ON DELETE CASCADE;
ALTER TABLE dbo.mfgorders ADD CONSTRAINT FK_mfgorders_mfg_types FOREIGN KEY (MfgTypeId) REFERENCES dbo.mfg_types (MfgTypeId) ON UPDATE NO ACTION ON DELETE CASCADE;
这是上述代码的 ER 图:
该模型意味着 entity1 和 entity2 可以具有相同的 MfgOrderId,我当然不希望这样。我希望 MfgOrderId 仅引用其中一个实体。我认为在我的脑海中我希望利用 mfg_types 指向正确的实体表,但我觉得模型已经关闭,我会通过询问 SO 社区来增加几年的生活。
问候,约翰