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:
- 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.
- 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?
- 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.
- Seems dirty to me with a bunch of null fields in the banking_details table.
在继续之前:如果您决定采用一种缺乏参照完整性的存储银行详细信息的设计,请告诉我谁将成为 运行 它,这样我就永远无法与他们做生意。这很重要。您的应用程序逻辑中的约束条件 可能 得到遵守;事情的发生、异常、中断、不一致后来都会反映在数据中,因为没有有意义的保护措施。必须 遵循架构设计中的限制条件。更安全,银行数据是尽可能安全的东西。
您将#1 确定为次优是正确的;帐户就是帐户,无论谁拥有它。 #2 已出局,因为参照完整性是不可协商的。严格来说,#3 是最可行的方法,尽管如果您 知道 您永远不需要担心可能拥有银行详细信息的实体数量增加,您可以得到去掉 #4 和一个 CHECK
约束以确保每一行只有四个外键中的 一个 的值——但你使用的是 MySQL ,它忽略了 CHECK
约束,所以选择 #3.
索引你的外键,性能会很好。如果您需要,视图可以很好地避免样板 JOIN
s。
场景:多种类型到单一类型;一对多。 例如:
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:
- 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.
- 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?
- 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.
- Seems dirty to me with a bunch of null fields in the banking_details table.
在继续之前:如果您决定采用一种缺乏参照完整性的存储银行详细信息的设计,请告诉我谁将成为 运行 它,这样我就永远无法与他们做生意。这很重要。您的应用程序逻辑中的约束条件 可能 得到遵守;事情的发生、异常、中断、不一致后来都会反映在数据中,因为没有有意义的保护措施。必须 遵循架构设计中的限制条件。更安全,银行数据是尽可能安全的东西。
您将#1 确定为次优是正确的;帐户就是帐户,无论谁拥有它。 #2 已出局,因为参照完整性是不可协商的。严格来说,#3 是最可行的方法,尽管如果您 知道 您永远不需要担心可能拥有银行详细信息的实体数量增加,您可以得到去掉 #4 和一个 CHECK
约束以确保每一行只有四个外键中的 一个 的值——但你使用的是 MySQL ,它忽略了 CHECK
约束,所以选择 #3.
索引你的外键,性能会很好。如果您需要,视图可以很好地避免样板 JOIN
s。