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

时间:2015-03-16 09:28:14

标签: sql sql-server database database-design

SCENARIO

我想设计用于保存 Calfs 数据的表格。

属性/列牛和小牛之间的共同点

  • 价格
  • 出生日期 等等(有些来自FK,还有像Breed等)

为Calf保留的属性

为CATTLE(女性)保留的属性

  • IsMilking(Y或N)

  • InseminationDate(当然,牛可以多次受精,因此必须进行标准化,新表应该是:ID(使用CATTLE表PK的FK)和InsemDate - 但它应该存在仅适用于女性)

CATTLE的状态的特殊属性具有以下属性:

  • 两性中的共同点:{健康,生病}

  • 仅限女性使用:{怀孕,小母牛等}

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

现有设计

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

有一张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(但它需要继承,我必须拆分所有后续表,如STATUS表等)。

3 个答案:

答案 0 :(得分:2)

问题太宽泛且有很多可能的答案,但我试图进行数据库设计。

这不完美,但我希望它可以帮到你一点。

小腿表(小腿记录)

enter image description here

与牛2x的关系

enter image description here

牛表(牛记录)

enter image description here

牛关系

enter image description here

授精表(Insem记录)

enter image description here

特殊属性表

enter image description here

特殊属性记录表

enter image description here

特殊属性值表

enter image description here

Calves View

enter image description here

牛状态视图

enter image description here

答案 1 :(得分:1)

我认为有一张父亲和母亲的自我关系的动物表是要走的路。像这样的东西;

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)的 - 这让我为父亲和母亲创建了一个更复杂的外键,迫使父亲成为男性,母亲成为女性,间接阻止父母成为同一种动物。

答案 2 :(得分:1)

创建一个Animal表,其中包含所有人共有的属性和状态。这将包括父FK,如果谱系不可用,则自引用未知动物

然后为特定性别或阶段的属性创建单独的“扩展”表。 Cow,Bull,Calf等你可以重新使用Animal表中的PK作为扩展表的PK,因为它是1:1的关系。

这也可以使动物身份与性别状态分开,因此你可以拥有健康动物作为怀孕牛。

我过去曾为收养机构申请做过这件事。他们有一个具有共同属性的人员表,但是生育母亲或孩子特有的属性被放置在专用表中。每个领域都收集了30多个额外的字段。出生母亲/儿童记录仅占人们记录的25-30%,因此将它们分开而不是将60多个字段添加到保证为空的主表中是有意义的。