Mysql 具有多种类型的单对象关系表设计

Mysql 具有多种类型的单对象关系表设计,mysql,database-design,relational-database,database-schema,Mysql,Database Design,Relational Database,Database Schema,我正在为一个web应用程序创建一个数据库,并正在寻找一些建议,以对可能具有多种类型的单个实体进行建模,每种类型具有不同的属性 例如,假设我想为“数据源”对象创建一个关系模型。所有数据源都有一些共享属性,例如数字标识符、名称和类型。然后,每个类型将根据类型具有不同的属性。为了便于讨论,假设我们有两种类型,“SFTP”和“S3” 对于S3类型,我们可能必须存储bucket、AWSAccessKeyId、YourSecretAccessKeyID等。对于SFTP,我们必须存储地址、用户名、密码,可能是

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

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

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

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


这里有没有我遗漏的简单解决方案或最佳实践?

您所描述的是希望实现表继承的情况。有三种方法可以做到这一点,都在马丁·福勒的优秀著作中描述过

你所描述的你的第一个爱好叫福勒。这是我倾向于在数据库设计中使用的方法,但并不总是很适合。此方法最接近于数据库的OO视图,一个表表示抽象类,其他表表示抽象类的具体实现。必须从多个表中查询和更新数据

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

最后,第三种类型由Fowler调用。在我看来,这是最没用的。在这个方法中,您放弃了拥有任何类型的层次数据的所有概念,并为每个元素类型创建一个表。不过,有时这可能对你有用

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

您的备选方案是一个。对实体属性表编写SQL查询比较困难,但不必存储数据源子类型的表名。