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

Posted

技术标签:

【中文标题】如何重新设计这个 SQL 数据结构?【英文标题】:How to redesign this SQL data structure? 【发布时间】:2012-11-13 15:09:52 【问题描述】:

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

我想要实现的是:

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

    可以简单地选择有关具有已知 animal_id 的动物或所有具有已知类型的动物的数据

    拥有数据控件(以确保对于动物类型“狗”不允许插入数据,例如关于 fly_animal 的数据)

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

现有数据结构:

桌子:动物

animal_id(主键)

动物名称

动物年龄

animal_type(animal_types 表中的外键)

示例数据行:

1, '雷克斯', 3, 2

表格: animal_types

animal_type_id : int(主键)

animal_type_name : 字符

-- 以下是功能集:

house_animal:布尔值

flying_animal : 布尔值

wild_animal:布尔值

示例数据行:

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

2,“狗”,真,假,假

现在每个功能集都实现为表格,例如:

桌子: house_animal

animal_id(动物表中的外键)

最喜欢的食物

last_vet_visit_date

桌子:会飞的动物

animal_id(动物表中的外键)

length_of_wings

最大速度

等等

当前的数据结构让事情变得太复杂了。

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

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

有什么想法吗?

DBMS 是 PostgreSQL 版本 9.1。

【问题讨论】:

How to implement a super class, sub class relationship in the database?的可能重复 您能告诉我们更多关于如何使用这个数据集,以及什么样的应用程序会维护和访问它吗? 【参考方案1】:

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

桌子:动物

animal_id(主键)

动物名称

动物年龄

animal_type(animal_types 表中的外键)

示例数据行:

1, '雷克斯', 3, 2

表格:animal_types

animal_type_id : int(主键)

animal_type_name : 字符

现在将存储每种类型的允许特征的表

表格:animal_types_features

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

animal_type_feature_id : int(主键)

animal_type_feature_name : 字符

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

表格:animals_features

animal_id(餐桌动物的外键)

animal_type_id :(来自 animal_types_features 表的外键)

animal_type_feature_id(来自 animal_types_features 表的外键)

animal_feature_value : 字符

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

【讨论】:

以上是关于如何重新设计这个 SQL 数据结构?的主要内容,如果未能解决你的问题,请参考以下文章

如何轻松地重新排序 LINQ to SQL 设计器中的列?

如何设计Sql数据库中的字段为自动填充数据并自动加1的自增量

SQL Server修改表结构时,不允许保存更改,阻止保存要求重新创建表的更改

如何创建和规范化这个 SQL 关系数据库?

在sql2008中,如何查看已经创建好的视图,创建时候的语句?

Sql Server2008数据类型更改不能保存?