当N表与公共表具有1:1的关系时,如何保证唯一性?

时间:2011-08-11 11:57:02

标签: database database-design constraints

假设我有一个具有以下模型的场景:一个表示任何动物的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表中的给定行在DogBird表中的 JUST 一行?模型本身允许它......

动物不能同时是DogBird不是神话,但事实并非如此:P

如果只是通过玩模型,没有触发器就可以做到更好......

任何提示都将受到赞赏:)

4 个答案:

答案 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(鸟飞是)

这些方面的东西。因此,您可以为每种可能的动物创建任何类型的属性 每当您需要创建新动物时,您只需为其指定正确的属性。

我希望它有所帮助。