我正在为Web应用程序创建一个数据库,我正在寻找一些建议来建模可能有多种类型的单个实体,每种类型都有不同的属性。
作为一个例子,假设我想为“数据源”对象创建关系模型。将存在所有数据源的一些共享属性,例如数字标识符,名称和类型。然后,每种类型将根据类型具有不同的属性。为了论证,我们说有两种类型,“SFTP”和“S3”。
对于S3类型,我们可能必须存储存储桶,AWSAccessKeyId,YourSecretAccessKeyID等。对于SFTP,我们必须存储地址,用户名,密码,可能是某种键。
我的第一个倾向是将每个类型分解到他们自己的表中,其中任何非公共字段在主表“数据源”表中使用外键表示在该新表中。我不喜欢的是,然后我必须知道哪个表与存储在主表中的每个类型相关联,并根据该类型动态地重写来自Web应用程序的查询。
我是否缺少一个简单的解决方案或最佳实践?
答案 0 :(得分:0)
您所描述的是您希望实现表继承的情况。有三种方法可以做到这一点,所有这些都在Martin Fowler的优秀书籍Patterns of Enterprise Application Architecture中有所描述。
你所描述的第一种倾向被福勒称为Class Table Inheritance。这是我倾向于在我的数据库设计中使用的方法,但并不总是很合适。此方法最接近于数据库的OO视图,其中表表示抽象类,其他表表示抽象类的具体实现。必须从多个表中查询和更新数据。
听起来你真正想要使用的是Fowler所谓的Single Table Inheritance。在此方法中,您实际上将所有数据的列放在一个表中,并使用标识符列来标识哪些字段与元素类型相关联。查询通常更简单,但您必须处理鉴别器列。
最后,第三种类型被福勒称为Concrete Table Inheritance。在我看来,这是最没用的。在此方法中,您放弃具有任何类型的分层数据的所有概念,并为每个元素类型创建单个表。不过,有时候这对你有用。
这三种方法各有利弊。您应该参考上面的链接,看看哪个项目最适合您。