Database 如何重新设计此SQL数据结构?

Database 如何重新设计此SQL数据结构?,database,postgresql,Database,Postgresql,我有一个用于存储动物信息的数据结构。数据类型(列)取决于动物类型,只有少数是常见的。可以有许多具有不同特征集的动物类型(一种类型可以实现一个或多个特征集) 我想要实现的是: 有可能基于现有的特征集创建新的动物类型,而无需稍后修改数据结构 有可能对已知动物id的动物或已知类型的动物的所有数据进行简单选择 拥有数据控制(确保不允许为“狗”类动物插入数据,例如关于飞行动物的数据) 让它尽可能简单和愚蠢(当然,现在我可以在“插入前”编写一些存储过程和触发器,以确保所有数据都是正确的,但也许还有更优雅的方

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

我想要实现的是:

  • 有可能基于现有的特征集创建新的动物类型,而无需稍后修改数据结构

  • 有可能对已知动物id的动物或已知类型的动物的所有数据进行简单选择

  • 拥有数据控制(确保不允许为“狗”类动物插入数据,例如关于飞行动物的数据)

  • 让它尽可能简单和愚蠢(当然,现在我可以在“插入前”编写一些存储过程和触发器,以确保所有数据都是正确的,但也许还有更优雅的方法?)

  • 现有数据结构:

    表格:动物

    动物识别码(主键)

    动物名

    动物年龄

    动物类型(动物类型表中的外键)

    示例数据行:

    1,“雷克斯”,3,2

    表格:动物类型

    动物类型识别码:int(主键)

    动物类型名称:char

    --以下是功能集:

    家畜:布尔型

    飞行动物:布尔

    野生动物:布尔型

    示例数据行:

    1,“野生鹦鹉”,假,真,真

    2.“狗”,对,错,错

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

    表格:家畜

    动物标识(来自动物表的外键)

    最喜欢的食物

    上次检查访问日期

    表格:飞行动物

    动物标识(来自动物表的外键)

    翼长

    最大速度

    等等

    当前的数据结构使事情变得太复杂

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

    为什么我不为每种新类型创建一个表呢?因为我不想要,例如200 每个表中只有几行的表

    有什么想法吗


    DBMS是PostgreSQL 9.1版。

    一种方法是不为每种不同类型的动物制作一张表格。相反,您可以使用一个引用动物类型的表来存储每种类型的特征。应该是这样的:

    表格:动物

    动物识别码(主键)

    动物名

    动物年龄

    动物类型(动物类型表中的外键)

    示例数据行:

    1,“雷克斯”,3,2

    表格:动物类型

    动物类型识别码:int(主键)

    动物类型名称:char

    现在是存储每种类型的允许特性的表

    表格:动物类型特征

    动物类型标识:int(主键)(来自动物类型表的外键)

    动物类型特征id:int(主键)

    动物类型特征名称:char

    然后是一张表格,用于存储每种动物的特征:

    表格:动物特征

    动物标识(表动物的外键)

    动物类型标识:(来自动物类型特征表的外键)

    动物类型特征id(来自动物类型特征表的外键)

    动物特征值:char


    这是一个非常简单的例子,可以添加的一件事是,animal_type_特性可以有一个列来存储数据,以指示每个特性可以使用哪些有效数据。这种方式的好处是允许在不额外修改应用程序和/或数据库的情况下实现新类型。

    可能的重复。您能告诉我们有关如何使用此数据集的更多信息,以及什么样的应用程序将维护和访问它吗?