【问题标题】:When to use one to many vs many to many in right situation?在正确的情况下何时使用一对多与多对多?
【发布时间】:2022-07-26 23:55:52
【问题描述】:

我很困惑何时使用或不使用一对多与多对多。例如,用户角色。在这种情况下,多对多在减少数据大小方面具有优势,因为它只指向整数,可能每行节省 1-10 个字节,例如,id 为 7 的高级开发人员字符,它在 smallint 中消耗 2 个字节,而不是 16 个字节。但是,它使膨胀表。如果这种情况使用多对多。如果多对多具有优势,为什么还要存在一对多?对多对多不总是好的吗?

Users table
id
username
password

Users_Roles table
user_id
role

对比

Users table

Users_Roles table
user_id
role_id

Roles table
id
role

【问题讨论】:

  • 您确定您的角色名称永远不会改变吗?
  • @shawnt00 如果可以更改。我认为这两种设计都没有问题。如果一对多。只需删除或更新用户的角色。如果多对多。只需更新或删除连接表。
  • @shawnt00 我仍然没有得到一对多的优势。除了它减少膨胀表。我想知道谁在处理大数据。一对多的设计还在使用吗?或者只是忽略并始终传递给多对多。多对多可以作为优化数据库。对于拥有亿行的服务器来说,减少 1-20Bytes/ 行是巨大的

标签: sql


【解决方案1】:

您过早地进行了优化。这里有几个整数,不太可能影响您的数据大小或性能。如果是这样,以后可以更改架构。

一对多与多对多不是优化问题。这是关于表之间的关系。

  • 如果只有一个用户可以拥有一个角色,请使用一对多。
  • 如果多个用户可以拥有相同的角色,请使用多对多。

例如,如果您拥有管理员角色并且只能有一个管理员用户,请使用一对多。如果可以有多个管理员,请使用多对多。您必须确定用户和角色之间的关系。

注意:对 id 使用 bigints。 40 亿可能看起来很多,但它很快就会出现,并且可能发生的最糟糕的事情之一就是 ID 用完。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-06
    相关资源
    最近更新 更多