假设我有一个具有以下模型的场景:一个表示任何动物的Animal
表,一个Dog
表和一个Bird
表,每个表都具有1:1的关系使用Animal
表。
动物
INTEGER id (PK)
STRING name
鸟
INTEGER id (PK FK referencing `Animal.id`)
狗
INTEGER id (PK FK referencing `Animal.id`)
(我只给出要清楚的钥匙)
如何保证Animal
表中的给定行在Dog
或Bird
表中的 JUST 一行?模型本身允许它......
动物不能同时是Dog
和Bird
(不是神话,但事实并非如此:P )
如果只是通过玩模型,没有触发器就可以做到更好......
任何提示都将受到赞赏:)
答案 0 :(得分:3)
这可能是@Pranay的意思,但答案是不完整的。将列TYPE添加到所有表,然后将其限制为:
create table Animal (id integer,
type string,
name string,
primary key (id),
unique (id, type)
);
create table Bird (id integer,
type string default 'BIRD' check (type='BIRD'),
primary key (id),
foreign key (id, type) references Animal (id, type)
);
create table Dog (id integer,
type string default 'DOG' check (type='DOG'),
primary key (id),
foreign key (id, type) references Animal (id, type)
);
请参阅David Portas's blog对此的充分解释。
答案 1 :(得分:1)
在您的数据库中,您可以在表格中添加一个列,如AnimalType
AnimalTable
Id
AnimalType -- 1 = dog, 2= bird, 3= other
答案 2 :(得分:0)
我不认为这可以在没有triggers / constraints的情况下完成,同时保持表格分开。
答案 3 :(得分:-2)
我觉得这里的数据库设计是错误的。我说的原因似乎是每个新动物都需要创建新表。通常,您希望以这种方式创建数据库,以便每次需要添加数据时架构都不会发生变化。
这是一种方法:
表动物
animal_id PK
命名
表animailProperties
property_id PK
命名
表动物描述
animail_id FK
property_id FK
property_data
示例:
表动物
1狗狗
2猫
3只鸟
表animailProperties
1条腿
2个翅膀
3飞
表动物描述
1 1 4(狗腿4)
1 2 0(狗翅膀0)
1 3 0(狗飞不)
2 1 4(猫腿4)
2 2 0(猫翅膀0)
2 3 0(猫飞不)
3 1 2(鸟腿2)
3 2 2(鸟翼2)
3 3 1(鸟飞是)
这些方面的东西。因此,您可以为每种可能的动物创建任何类型的属性
每当您需要创建新动物时,您只需为其指定正确的属性。
我希望它有所帮助。