【问题标题】:MySQL creating a common table for common fields of many tablesMySQL为许多表的公共字段创建一个公共表
【发布时间】:2020-12-17 07:31:10
【问题描述】:

我的项目中有 100 多个 MYSQL 表,并且大部分项目都有公共字段,如 created_by、last_modified_date、last_modified_by 和其他一些字段。用这些公共字段创建一个新表并与该表添加一对一关系是个好主意吗?例如。

  • common_table:id、created_by、last_modified_by
  • table1:id、姓名、地址、common_table_id
  • table2:id、姓名、余额、日期、common_table_id
  • table3:id、价格、isActive、common_table_id
  • tableN:字段 ....,common_table_id

在上面的示例中,我有一个表名 common_table 包含所有公共字段,并且该表与所有其他表具有一对一的关系。这使我更容易添加或更新公共字段,而无需在所有表中复制它。由于我处于开发阶段,这种方法是否存在性能缺陷或将来会导致其他生产问题?

【问题讨论】:

  • 如果同一个ID可以在不同的tableN中,这将不起作用。
  • 每个表都有自己的公用表ID,即公用表不可重用。
  • 这样做没什么好处,恕我直言。
  • 拆分表应该代表实体之间的逻辑关系。您不会仅仅因为列相似就这样做。它不节省存储空间(所有相同的数据都必须存储,它们只是在不同的表中),而且它使查询更加复杂。
  • 是的,我同意,现在我放弃这个想法来共享一个公用表。

标签: mysql sql database-design


【解决方案1】:

在查询方面,我预计不会有任何问题——假设common_table_id 有一个主键。如果您有非常大的表格和小表格,可能会出现一些问题。公用表最终可能会被加载到内存中,即使只使用了小块(因为引用表很小)。

一个更大的问题可能是更新,其中不同表上的插入/更新现在具有也在修改的公共列。这可能会引入锁定依赖关系。但是,如果插入相对不频繁(每秒不超过几个),这可能不是问题。

您可能想要调整模型以在公用表中也有一个表 ID。您可以使用它来对表进行分区。这样,只需将给定表的公共元素加载到内存中进行查询和更新。

【讨论】:

    【解决方案2】:
    • 一对一是危险信号。

    • 冗余数据是一个危险信号。

    如果 table1 和 table2 是 1:1,则很少有正当理由将它们分成两个表。即使这导致单个表中有 100 列。

    提供小组数据。一定要包括任何变化——我不知道balance 和price 是否共享相同 create_date,或者每个都有自己的create_date,它们可能不同。

    【讨论】:

      猜你喜欢
      • 2014-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-26
      • 1970-01-01
      • 2019-11-29
      • 2014-10-16
      • 1970-01-01
      相关资源
      最近更新 更多