数据库设计问题——不同性别的不同状态
Database Design Issue - Different Statuses for Different Sex
场景
我想设计tables来保存Cattle和[=41=的数据]小腿。
Attributes/columns 常见于牛和小牛
- 价格
- 出生日期
等等(有些来自 FK 以及 Breed 等)
小牛保留属性
- 父亲
- 妈妈
为CATTLE(女)保留的属性
正在挤奶(是或否)
InseminationDate(当然,一头母牛可以被多次授精,因此必须对其进行标准化,并且应该有一个新的 table 作为:ID(FK 使用 CATTLE 的 PK table) 和 InsemDate - 但它应该只存在于 FEMALE)
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 多个字段是有意义的。
场景
我想设计tables来保存Cattle和[=41=的数据]小腿。
Attributes/columns 常见于牛和小牛
- 价格
- 出生日期 等等(有些来自 FK 以及 Breed 等)
小牛保留属性
- 父亲
- 妈妈
为CATTLE(女)保留的属性
正在挤奶(是或否)
InseminationDate(当然,一头母牛可以被多次授精,因此必须对其进行标准化,并且应该有一个新的 table 作为:ID(FK 使用 CATTLE 的 PK table) 和 InsemDate - 但它应该只存在于 FEMALE)
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 多个字段是有意义的。