mysql - 具有/多种类型的单个对象的关系表设计

标签 mysql database-design relational-database database-schema

我正在为 Web 应用程序创建数据库,并正在寻找一些建议来对可能具有多种类型的单个实体进行建模,每种类型具有不同的属性。

作为示例,假设我想为“数据源”对象创建一个关系模型。所有数据源都会有一些共享属性,例如数字标识符、名称和类型。然后,每种类型将根据类型具有不同的属性。为了便于讨论,假设我们有两种类型:“SFTP”和“S3”。

对于 S3 类型,我们可能必须存储存储桶、AWSAccessKeyId、YourSecretAccessKeyID 等。对于 SFTP,我们必须存储地址、用户名、密码,可能还有某种 key 。

我的第一个倾向是将每种类型分解到它们自己的表中,任何非公共(public)字段都在新表中表示,并在主“数据源”表中使用外键。我不喜欢的是,我必须知道哪个表与主表中存储的每种类型相关联,并根据该类型动态重写来自 Web 应用程序的查询。

我在这里缺少简单的解决方案或最佳实践吗?

最佳答案

您所描述的是您想要实现表继承的情况。有三种方法可以做到这一点,所有这些都在 Martin Fowler 的优秀著作 Patterns of Enterprise Application Architecture 中进行了描述。 .

您所描述的第一个倾向称为 Class Table Inheritance由福勒.这是我在数据库设计中倾向于使用的方法,但并不总是适合。此方法最接近于数据库的 OO View ,其中一个表表示抽象类,其他表表示抽象类的具体实现。必须从多个表查询和更新数据。

听起来您真正想要使用的名称是 Single Table Inheritance由福勒.在此方法中,您实际上将所有数据的列放入一个表中,并使用鉴别器列来标识哪些字段与元素类型关联。查询通常更简单,尽管您必须处理鉴别器列。

最后,第三种称为Concrete Table Inheritance由福勒.在我看来,这是最没有用的。在此方法中,您放弃拥有任何类型的分层数据的所有概念,并为每种元素类型创建一个表。不过,有时这可能对您有用。

这三种方法各有利弊。您应该查阅上面的链接,看看哪个最适合您的项目。

关于mysql - 具有/多种类型的单个对象的关系表设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23941571/

相关文章:

sql - SQL 中的连接顺序重要吗?

mysql - SQL 查询返回包含来自另一列的数据的列

performance - 保留历史记录和当前概览

MYSQL 数据库 - 如何使用存储应显示的订单项目的 "order"列 - 按另一列分组

mysql - 如何查找并存储用户出现在搜索条件中的次数

MySQL:为什么 NULL 在 MySQL 中被忽略?

mysql - Erlang emysql iPhone 表情符号编码问题

mysql - 在查询中正确使用 COUNT 函数来获取百分比 (MySQL)

mysql。使用 IF 选择 field=1 或 field=2

java - 使用 Kafka 在两个微服务之间同步数据