如何重新设计这个SQL数据结构?

时间:2012-11-13 15:09:53

标签: database postgresql

我有一个用于存储动物信息的数据结构。数据类型(列)取决于动物类型,只有少数是常见的。可以有许多具有不同特征集的动物类型(一种类型可以实现一个或多个特征集)。

我想要达到的目标是:

  1. 有可能根据现有的特征集创建新的动物类型,而不会在以后修改数据结构

  2. 有可能使用已知的animal_id或所有已知类型的动物简单选择有关动物的所有数据

  3. 进行数据控制(以确保动物类型'Dog'不允许插入数据,例如关于flying_animal的数据)

  4. 尽可能保持简单和愚蠢(当然现在我可以在插入之前编写一些存储过程和触发器“以确保所有数据都正确,但也许有更优雅的方式?)< / p>

  5. 现有数据结构:

    表:动物

    animal_id(主键)

    animal_name

    animal_age

    animal_type(来自animal_types表的外键)

    示例数据行:

    1,'雷克斯',3,2

    表: animal_types

    animal_type_id:int(主键)

    animal_type_name:char

    - 以下是功能集:

    house_animal:boolean

    flying_animal:boolean

    wild_animal:boolean

    示例数据行:

    1,'野鹦鹉',假,真,真

    2,'狗',真,假,假

    现在,每个功能集都以表格形式实现,例如:

    表: house_animal

    animal_id(来自动物表的外键)

    favorite_food

    last_vet_visit_date

    表:飞行动物

    animal_id(来自动物表的外键)

    length_of_wings

    MAX_SPEED

    当前的数据结构使事情过于复杂。

    您可以问我为什么不制作一个包含所有可能列和一个字典表的大表 与动物类型。当然我可以,但这使数据控制几乎不可能,以及如何 定义一个只允许一些列的新类型。?

    为什么我不为每种新类型创建一个表?因为我不希望有例如200 每个表中只有几行的表。

    有什么想法吗?

    DBMS是PostgreSQL版本9.1。

1 个答案:

答案 0 :(得分:1)

一种方法是不为每种不同类型的动物制作一张桌子。相反,您可以使用引用animal_types的表来存储每种类型具有的功能。它会是这样的:

表:动物

animal_id(主键)

animal_name

animal_age

animal_type(来自animal_types表的外键)

示例数据行:

1,'雷克斯',3,2

:animal_types

animal_type_id:int(主键)

animal_type_name:char

现在将存储每种类型的允许功能的表

:animal_types_features

animal_type_id:int(主键)(来自animal_types表的外键)

animal_type_feature_id:int(主键)

animal_type_feature_name:char

然后是一张存储每只动物特征的表格:

表: animals_features

animal_id(表动物的外键)

animal_type_id :(来自animal_types_features表的外键)

animal_type_feature_id(来自animal_types_features表的外键)

animal_feature_value:char

这是一个非常简单的例子,可以添加的一件事是animal_type_features可以有一个列来存储数据,以指示它可以用于每个功能的有效数据。这种方式的好处是允许实现新类型而无需额外修改应用程序和/或数据库。