我有一个数据结构用于存储有关动物的信息。数据类型(列)取决于动物类型,只有少数是常见的。可以有许多具有不同特征集的动物类型(一种类型可以实现一个或多个特征集)。
我想要实现的是:
有可能根据现有的特征集创建新的动物类型,而无需稍后修改数据结构
有可能对已知 animal_id 的动物或所有已知类型的动物的所有数据进行简单选择
拥有数据控制(以确保插入数据,例如关于 flying_animal 的数据不允许用于动物类型“狗”)
尽可能保持简单和愚蠢(当然,现在我可以在“插入前”编写一些存储过程和触发器来确保所有数据都是正确的,但也许有更优雅的方法?)
现有数据结构:
表:动物
animal_id(主键)
动物名
动物年龄
animal_type(来自 animal_types 表的外键)
示例数据行:
1, '雷克斯', 3, 2
表:动物类型
animal_type_id : int(主键)
动物类型名称:字符
-- 以下是功能集:
house_animal : bool 值
飞行动物: bool 值
野生动物: bool 值
示例数据行:
1, '野鹦鹉', false, true, true
2、'狗'、真、假、假
现在每个功能集都以表的形式实现,例如:
表:house_animal
animal_id(来自 animals 表的外键)
最喜欢的食物
last_vet_visit_date
表格:飞行动物
animal_id(来自 animals 表的外键)
翼长
最大速度
等等
当前的数据结构使事情变得过于复杂。
你可以问我为什么不做一个包含所有可能列的大表和一个字典表 与动物类型。我当然可以,但这使得数据控制几乎不可能,以及如何 定义一个只允许某些列的新类型..?
为什么我不为每个新类型创建一个表?因为我不想有例如200 每个表格中只有几行。
有什么想法吗?
DBMS 是 PostgreSQL 9.1 版。
最佳答案
一种方法是不要为每种不同类型的动物制作一张 table 。相反,您可以使用引用 animal_types 的表来存储每种类型所具有的特征。它会是这样的:
表:动物
animal_id(主键)
动物名
动物年龄
animal_type(来自 animal_types 表的外键)
示例数据行:
1, '雷克斯', 3, 2
表:动物类型
animal_type_id : int(主键)
动物类型名称:字符
现在将存储每种类型的允许功能的表
表:动物类型特征
animal_type_id : int(主键)(来自 animal_types 表的外键)
animal_type_feature_id : int(主键)
animal_type_feature_name : 字符
然后是一张表来存储每只动物的特征:
表:animals_features
animal_id(餐 table 动物的外键)
animal_type_id :(来自 animal_types_features 表的外键)
animal_type_feature_id(来自 animal_types_features 表的外键)
animal_feature_value : 字符
这是一个非常简单的例子,可以添加的一件事是 animal_type_features 可以有一个列来存储数据以指示它可以用于每个特征的有效数据。这种方式的好处是无需额外修改应用程序和/或数据库即可实现新类型。
关于database - 如何重新设计这个SQL数据结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13363230/