MySQL 数据库 Layout/Modelling/Design 方法/关系

MySQL Database Layout/Modelling/Design Approach / Relationships

场景:多种类型到单一类型;一对多。 例如:

parent 多种类型:学生 table、供应商 table、客户 table、酒店 table

child单一类型:银行明细

所以一个学生可能有多个银行详细信息,一个供应商也可以,等等。

布局选项1学生table(id)+students_banking_details(student_id)table具有适当的id关系, 按 parent 类型重复。

布局选项 2 学生 table(+其他)+ banking_details table。 banking_details 将有一个用于链接的 parent_id 列和一个用于确定 parent 是什么(学生/供应商/客户等)的 parent_type 字段。

布局选项 3 学生 table(+其他)+ banking_details table。然后我会为每个 parent 类型(例如:students_banking_details)创建另一个关联 table 以链接 student_id 和 banking_details_id.

布局选项 4 学生 table(+其他)+ banking_details table。 banking_details 每个 parent 类型都有一列,即:student_id、supplier_id、customers_id - 等等

其他?您的输入...

My thoughts on each of these:

  1. Multiple tables of the same type of information seems wrong. If I want to change what gets stored about banking details, thats also several tables I have to change as opposed to one.
  2. Seems like the most viable option. Apparently this doesnt maintain 'referential integrity' though. I don't know how important that is to me if I'm just going to be cleaning up children programatically when I delete the parents?
  3. Same as (2) except with an extra table per type so my logic tells me this would be slower than (2) with more tables and with the same outcome.
  4. Seems dirty to me with a bunch of null fields in the banking_details table.

在继续之前:如果您决定采用一种缺乏参照完整性的存储银行详细信息的设计,请告诉我谁将成为 运行 它,这样我就永远无法与他们做生意。这很重要。您的应用程序逻辑中的约束条件 可能 得到遵守;事情的发生、异常、中断、不一致后来都会反映在数据中,因为没有有意义的保护措施。必须 遵循架构设计中的限制条件。更安全,银行数据是尽可能安全的东西。

您将#1 确定为次优是正确的;帐户就是帐户,无论谁拥有它。 #2 已出局,因为参照完整性是不可协商的。严格来说,#3 是最可行的方法,尽管如果您 知道 您永远不需要担心可能拥有银行详细信息的实体数量增加,您可以得到去掉 #4 和一个 CHECK 约束以确保每一行只有四个外键中的 一个 的值——但你使用的是 MySQL ,它忽略了 CHECK 约束,所以选择 #3.

索引你的外键,性能会很好。如果您需要,视图可以很好地避免样板 JOINs。