我正在生产数据库的一部分。该业务部门接受自定义订单,并构建符合规格的项目。他们只构建几种(假设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;
该模型暗示一个entity1和entity2可以具有相同的MfgOrderId,我当然不希望这样。我希望MfgOrderId仅引用实体之一。我认为我希望利用mfg_types指向正确的实体表,但是我觉得该模型已关闭,我会向SO社区咨询,以增加自己的生活几年。
问候,约翰
您的设计要表达的或试图表达的是父类型和子类型的关系。
一种表达方式是MfgTypeId在每个Entity表中包括该字段:
MfgTypeId
CREATE TABLE dbo.mfgorders_entity2 (MfgOrderId int NOT NULL, MfgTypeId tinyint 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, MfgTypeId), CONSTRAINT chkEntity2_MfgTypeID CHECK (MfgTypeId = 'Type Id for Entity 2')) ;
我可能还会更改MfgOrders表以将MfgTypeId包括在内作为主键的一部分。
MfgOrders
CREATE TABLE dbo.mfgorders (MfgOrderId int NOT NULL IDENTITY (1, 1) , MfgTypeId tinyint NOT NULL, OrderId int NOT NULL, LineNbr tinyint NOT NULL, ItemDescription varchar (999) , ManufacturingCost smallmoney, CONSTRAINT PK_mfgorders PRIMARY KEY (MfgOrderId, MfgTypeId)) ;