mysql - 为什么将数据存储在数据库的不同行上?

标签 mysql

我注意到有些人将相关数据存储在数据库的不同行上,而有些人将相关数据放在同一行上。

例如

  id  user_id  field_id  value
  1      1        9     "name 1"
  2      1       10     "address 1"
  3      1       11     "phone 1"
  4      2        9     "name 2"
  5      2       10     "address 2"
  6      2       11     "phone 2"

对比

 id     user_id    name         address      phone
 1        1        name 1     address 1     phone 1
 2        2        name 2     address 2     phone 2

这里您可以看到两种存储用户 1 和用户 2 数据的方法。我不知道为什么使用第一种方法而不是第二种方法。

我遇到一些数据库使用第一种方法,如果你想做一件简单的事情,SQL语句很快就会变得非常复杂。而第二种方法非常简单直接。

我想知道是否有人知道为什么人们继续使用第一种方法,以及是否有我看不到的优点。

谢谢

最佳答案

第一个表设计允许最终用户动态添加新字段。某些软件可能允许您向某些内容添加新字段。许多 CMS 以及 Jira 等应用程序都这样做。大概有一个单独的 fields 表可以在其中定义这些字段。

如果您没有明确的需求,请不惜一切代价避免这种模式。这确实是一种只有在别无选择的情况下才应该做的事情,即使这样也可能更有意义:

  • 仅对自定义字段执行此操作,但保持默认字段平坦
  • 也许可以使用 JSON 类型,然后将所有自定义数据转储到其中。它不像键->值表索引很好。

关于mysql - 为什么将数据存储在数据库的不同行上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48895912/

相关文章:

php - jEditable 选择数据源

mysql - MYSQL表中的约束?

mysql - ASP MySQLRoleProvider 将角色与用户联系起来

mysql - 合并 SQL 中 Distinct、Count 和 Select 的概念

mysql - 在 MySQL select 语句中将值从 1 更改为 Yes

mysql - ALTER TABLE ORDER BY str_to_date 和 time_to_sec

mysql - 如何在 MYSQL 中修复错误的导入日期时间

mysql - 我想知道是否有人知道如何找到最小值和最大值并找到它们之间的时间范围?

php - 将类似日期的字符串保存到数据库,但 MYSQL 将其转换为十进制字符串

mysql - 找到没有关系的多对多