数据库设计问题——不同性别的不同状态

Database Design Issue - Different Statuses for Different Sex

场景

我想设计tables来保存Cattle[=41=的数据]小腿

Attributes/columns 常见于牛和小牛

小牛保留属性

为CATTLE(女)保留的属性

CATTLE 有一个特殊属性 Status,具有以下属性:

由于这种无能的设计,我的整个软件都失败了。我现有的设计如下:

现有设计

CATTLE 有一个 table 引用所有 STATUS、BREED 等 table,因为它是 FK。

有一个 table 的 CALF 具有这些列:

ID (FK from CATTLE table) - Having cattle and calf in same table is apparently failing
FatherID (FK from CATTLE table) - Again we can have Calfs themselves as Father in this column
MotherID (FK from CATTLE table) - Same issue

提前致谢。我已经尽力了。为 MALE 和 FEMALE 拆分 tables(但它需要继承,我必须拆分所有后续的 tables,如 STATUS table 等)。

问题太宽泛,可能的答案很多,但我尝试了,因为我正在研究数据库设计。

虽然不够完美,但希望能对您有所帮助。

小腿Table(小腿记录)

与牛的关系 2x

牛Table(牛记录)

牛人关系

授精Table(授精记录)

特殊属性Table

特殊属性记录Table

特殊属性值Table

小腿视图

牛状态视图

我认为一个 table 的动物和一个 self-relationship 的父亲和母亲是可行的方法。像这样;

CREATE TABLE [dbo].[Animal](
    [AnimalID] [int] IDENTITY(1,1) NOT NULL,
    [Sex] [char](1) NOT NULL CONSTRAINT [Animal_Sex] CHECK  (([Sex]='F' OR [Sex]='M')),
    [Name] [varchar](100) NOT NULL,
    [Price] [money] NULL,
    [BirthDate] [date] NULL,
    [Father_AnimalID] [int] NULL,
    [Father_Sex]  AS (CONVERT([char](1),'M')) PERSISTED,
    [Mother_AnimalID] [int] NULL,
    [Mother_Sex]  AS (CONVERT([char](1),'F')) PERSISTED,
    [IsMilking] [char](1) NULL,
    [HealthStatus] [char](1) NULL,
    [FemaleStatus] [char](1) NULL,
    CONSTRAINT [PK_Animal] PRIMARY KEY CLUSTERED ([AnimalID]),
    CONSTRAINT [AK_Animal] UNIQUE NONCLUSTERED ([AnimalID], [Sex])
)

ALTER TABLE [dbo].[Animal] ADD CONSTRAINT [FK_Animal_Animal_Father] 
    FOREIGN KEY([Father_AnimalID], [Father_Sex]) REFERENCES [dbo].[Animal] ([AnimalID], [Sex])

ALTER TABLE [dbo].[Animal] ADD CONSTRAINT [FK_Animal_Animal_Mother] 
    FOREIGN KEY([Mother_AnimalID], [Mother_Sex]) REFERENCES [dbo].[Animal] ([AnimalID], [Sex])

请注意我是如何添加几个常量计算列(Father_Sex 和 Mother_Sex)的 - 这让我可以为父亲和母亲创建一个更复杂的外键,迫使父亲公母母母,间接避免父母同为动物

创建一个动物 table,其中包含所有人共有的属性和状态。这将包括 parent FK,self-referencing 如果血统不可用,则为未知动物

然后为特定性别或阶段的属性创建单独的 "extended" table。牛、公牛、小牛等。您可以 re-use 来自动物 table 的 PK 作为扩展 table 的 PK,因为它是 1:1 关系。

这也允许将动物状态与性别状态分开,因此您可以拥有一只健康的动物作为怀孕的牛。

我过去曾为收养机构申请这样做过。他们有一个 table 具有共同属性的人,但是特定于生母或 child 的属性被放置在专用的 table 中。每个字段收集了 30 多个额外的字段。出生 mom/child 记录仅占人员记录的 25-30%,因此将它们分开而不是向保证为空的主要 table 添加 60 多个字段是有意义的。