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

Sql 数据库设计问题-不同性别的不同状态,sql,sql-server,database,database-design,Sql,Sql Server,Database,Database Design,场景 我想设计用于保存牛群和Calfs数据的表格 牛和小牛中常见的属性/列 价格 出生日期 等(一些来自FK以及品种等) 为小腿保留的属性 父亲 母亲 为牛(雌性)保留的属性 IsMilking(Y或N) 授精日期(非正常情况下,母牛可以多次授精,因此必须对其进行标准化,并且应提供一个新表,如:ID(使用牛表PK的FK)和授精日期-但该表仅适用于雌性) 具有以下属性的牛有一个特殊的身份属性: 男女通用:{健康,疾病} 仅限雌性:{怀孕、母牛等} 由于这个不称职的设计,我的整个软件

场景

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

牛和小牛中常见的属性/列

  • 价格
  • 出生日期 等(一些来自FK以及品种等)
为小腿保留的属性

  • 父亲
  • 母亲
为牛(雌性)保留的属性

  • IsMilking(Y或N)

  • 授精日期(非正常情况下,母牛可以多次授精,因此必须对其进行标准化,并且应提供一个新表,如:ID(使用牛表PK的FK)和授精日期-但该表仅适用于雌性)

具有以下属性的牛有一个特殊的身份属性:

  • 男女通用:{健康,疾病}

  • 仅限雌性:{怀孕、母牛等}

由于这个不称职的设计,我的整个软件都失败了。我现有的设计如下:

现有设计

有一个牛表引用所有状态、品种等表,因为它是FK

有一个包含以下列的表:

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

提前谢谢。我已经尽了最大的努力。为男性和女性拆分表(但这需要继承,而且我还必须拆分所有后续表,如状态表等)

这个问题太宽泛了,可能的答案太多了,但由于我对数据库设计感兴趣,所以我试着回答

它并不完美,但我希望它能对你有所帮助

小腿表(小腿记录)

与牛的关系2x

牛表(牛记录)

牛的关系

授精表(授精记录)

特殊属性表

特殊属性记录表

特殊属性值表

小腿视图

牛的地位观


这个问题太宽泛了,可能的答案太多了,但由于我对数据库设计很感兴趣,所以我试着这么做

它并不完美,但我希望它能对你有所帮助

小腿表(小腿记录)

与牛的关系2x

牛表(牛记录)

牛的关系

授精表(授精记录)

特殊属性表

特殊属性记录表

特殊属性值表

小腿视图

牛的地位观


我认为,为动物提供一张桌子,让它们与父亲和母亲有一种自我关系,这是一条可行之路。像这样的东西

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])

注意,我如何添加了两个常量计算列(父子性别和母子性别)-这让我可以为父子和母亲创建一个更复杂的外键,强制父亲为男性,母亲为女性,而且间接地阻止了父亲和母亲成为同一个动物。

我认为,为父亲和母亲建立一个自我关系的动物提供一张桌子是最好的选择。像这样的东西

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])

注意,我如何添加了两个常量计算列(父子性别和母子性别)-这让我可以为父子和母亲创建一个更复杂的外键,强制父亲为男性,母亲为女性,并间接防止父亲和母亲成为同一动物。

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

然后为特定性别或阶段的属性创建单独的“扩展”表。奶牛、公牛、小牛等。您可以重复使用动物表中的PK作为扩展表的PK,因为它是1:1关系

这也将允许动物状态与性别状态分开,所以你可以有一个健康的动物作为怀孕的牛


我过去是为了收养机构的申请才这样做的。他们有一个具有公共属性的人员表,但特定于生母或孩子的属性被放置在专用表中。为每个字段收集了30多个附加字段。出生母亲/孩子记录只占人口记录的25-30%,因此将其分开是有意义的,而不是向主表中添加60多个保证为空的字段。

创建一个包含所有人共有的属性和状态的动物表。这将包括父代FKs,如果血统不可用,则自我引用未知动物

然后为特定性别或阶段的属性创建单独的“扩展”表。奶牛、公牛、小牛等。您可以重复使用动物表中的PK作为扩展表的PK,因为它是1:1关系

这也将允许动物状态与性别状态分开,所以你可以有一个健康的动物作为怀孕的牛


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

指示“未知父母”的记录将允许您将所有动物放在同一个表中。其设计是什么?你的意思是小牛的父亲和母亲栏也应该列在动物表中吗?我不是农民,但没有被屠宰的小牛不是变成牛(牛、公牛和公牛)吗?你为什么不想为所有动物存储有关父母的信息?追踪血统的能力在所有情况下都不重要吗