【问题标题】:Foreign key necessary or not?外键是否必要?
【发布时间】:2020-05-09 17:42:37
【问题描述】:

假设我有四个表:

 Table 1 - Users  - id, name
 Table 2 - Models - id, user_id, name
 Table 3 - Types  - id, user_id, name
 Table 4 - Cars   - id, user_id, model_id, brand_id

从技术上讲,我不需要 Cars 表中的“user_id”列。

使用 'user_id' fk 是个好习惯吗?冗余?当然它更容易编程......

【问题讨论】:

  • 你能解释一下为什么在 Models and Types 中有一个 user_id 列吗?
  • 需要吗?这就像在Users 中询问您是否需要一个列email — 如果您需要该信息,则需要它,如果您不想要它,则不需要它。我们不知道您的数据意味着什么,但您可能有负责给定型号、类型或汽车的用户……或不负责。也许问题在于user_id 并没有真正解释角色的含义(与例如main_driver_user_id 进行比较)。
  • FK 提供了一个索引(用于JOINs 中的效率)和一个约束(用于数据完整性)。您可以制作自己的索引;约束是检查你最终会消除的错误。

标签: mysql database database-design foreign-keys


【解决方案1】:

您并不真正需要的是ModelsTypes 中的user_id 列。
汽车型号和汽车类型与用户没有直接关系。
这种设计很有意义:

Table 1 - Users  - id, name
Table 2 - Models - id, name
Table 3 - Types  - id, name
Table 4 - Cars   - id, user_id, model_id, type_id

如果每辆车只与一个用户相关,但如果它可以与更多用户相关,那么您需要另一个表:

Table 1 - Users       - id, name
Table 2 - Models      - id, name
Table 3 - Types       - id, name
Table 4 - Cars        - id, model_id, type_id
Table 5 - CarsUsers   - car_id, user_id 

【讨论】:

  • 型号、类型和汽车都只与一个用户相关。
  • 那你为什么不只为用户使用 1 个表和 1 个包含 user_id、model_name、type_name 和 car_name 的表?如果一个用户只能与 1 辆汽车、型号和类型相关联,为什么您没有只有 1 个包含所有信息的表?
  • 我认为这是“过度规范化”。那就是没有足够的论据来使用 model_idtype_id 而不是简单的字符串。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-11
  • 1970-01-01
  • 2012-08-22
  • 2018-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多