mysql - 如何在数据库中建模面向对象的设计?

标签 mysql database data-modeling object-oriented-analysis object-oriented-database

假设我们有如下三个概念:

概念(attribute1, attribute2, ..)

A (a, b, c, d)

B (a, b, c, d, e)

C (a, b, c, d, f)

在数据库中对这三个概念建模有三个选项:

1) 按原样建模

表 { column1, column2, ... }

A { id, a, b, c, d }

B { id, a, b, c, d, e }

C { id, a, b, c, d, f }

缺点:存在数据冗余。

2) 在一张表中建模

A { id, object_type, a, b, c, d, e, f }

缺点:某些概念的某些字段仍为空。

3)使用表之间的关系

A { parent_id, a, b, c, d }

B { id, parent_id, e }

C { id, parent_id, f }

缺点:增加连接表的查询复杂性。

您会使用哪种方法?你有其他解决方案吗?您认为第三种方法性能较差吗?

最佳答案

显然,您的选项 1 是最糟糕的选择。这里的主要问题是您需要复制 B 的所有行。和 CA ,从而造成严重的维护问题。

您的选项 2 称为单表继承 模式,建议在子表没有 (m) 任何额外列的情况下使用。

您的选项 3 称为Joined Tables Inheritance 模式,其中子表(代表子类)通过它们的主键连接到它们的超表,同时也是引用超表的外键.

因此,对于您的抽象示例,似乎选项 2 是推荐的方法,因为您的表 BC只有一列。

请注意,根据 Joined Tables Inheritance 方法,无需添加主键属性(就像您在 idB 中对 C 所做的那样)。您只需使用与超表相同的主键,并使其也成为引用超表的外键。因此,在这种方法中,架构将是

A { id PK, 
    a, b, c, d 
}
B { id PK REFERENCES A, 
    e 
}
C { id PK REFERENCES A, 
    f 
}

您可以在 Subtyping and Inheritance with Database Tables 部分阅读更多相关信息关于使用类层次结构开发前端 Web 应用程序的教程。

关于mysql - 如何在数据库中建模面向对象的设计?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28211235/

相关文章:

Mysql 转储还原失败 : Cannot add foreign key constraint

mysql - 如何设计这种多对多的数据库?

mysql - 使用 MySQL 将度/分/秒转换为小数

data-modeling - 什么是 "order line"?

json - 如何在 Airtable 中存储一团 JSON?

mysql - 如何处理多父表

php - MySQL排序多个时间戳

javascript - 如何离线和在线运行 Web 应用程序(在 .NET 中)

php - MYSQL IF 语句按类别重新排序

sql - C# SQL INSERT INTO 查询并显示结果