Sql 数据库设计问题-不同性别的不同状态
场景 我想设计用于保存牛群和Calfs数据的表格 牛和小牛中常见的属性/列Sql 数据库设计问题-不同性别的不同状态,sql,sql-server,database,database-design,Sql,Sql Server,Database,Database Design,场景 我想设计用于保存牛群和Calfs数据的表格 牛和小牛中常见的属性/列 价格 出生日期 等(一些来自FK以及品种等) 为小腿保留的属性 父亲 母亲 为牛(雌性)保留的属性 IsMilking(Y或N) 授精日期(非正常情况下,母牛可以多次授精,因此必须对其进行标准化,并且应提供一个新表,如:ID(使用牛表PK的FK)和授精日期-但该表仅适用于雌性) 具有以下属性的牛有一个特殊的身份属性: 男女通用:{健康,疾病} 仅限雌性:{怀孕、母牛等} 由于这个不称职的设计,我的整个软件
- 价格
- 出生日期 等(一些来自FK以及品种等)
- 父亲
- 母亲
- IsMilking(Y或N)
- 授精日期(非正常情况下,母牛可以多次授精,因此必须对其进行标准化,并且应提供一个新表,如:ID(使用牛表PK的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多个保证为空的字段。指示“未知父母”的记录将允许您将所有动物放在同一个表中。其设计是什么?你的意思是小牛的父亲和母亲栏也应该列在动物表中吗?我不是农民,但没有被屠宰的小牛不是变成牛(牛、公牛和公牛)吗?你为什么不想为所有动物存储有关父母的信息?追踪血统的能力在所有情况下都不重要吗