SCENARIO
我想设计用于保存 牛 和 Calfs 数据的表格。
属性/列牛和小牛之间的共同点
为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表等)。
答案 0 :(得分:2)
问题太宽泛且有很多可能的答案,但我试图进行数据库设计。
这不完美,但我希望它可以帮到你一点。
小腿表(小腿记录)
与牛2x的关系
牛表(牛记录)
牛关系
授精表(Insem记录)
特殊属性表
特殊属性记录表
特殊属性值表
Calves View
牛状态视图
答案 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多个字段添加到保证为空的主表中是有意义的。