mysql - 数据库设计。一对多还是多对多?

标签 mysql sql database sqlite relational-database

在我的应用程序中,我需要为我的用户分配多个组。有 1000 多个用户和 10-15 个群组。

哪种数据库设计更好?

一对多:

USER_ID | GROUP_1 | GROUP_2 | ... | GROUP_15
--------------------------------------------
 1      | true    | false   | ... | true
 2      | false   | true    | ... | true
 3      | true    | true    | ... | true
 .      | .       | .       | ... | . 
 .      | .       | .       | ... | . 
 .      | .       | .       | ... | . 

或多对多:

USER_ID | GROUP_ID 
------------------
 1      | 1
 1      | 15
 2      | 2
 2      | 15
 3      | 1
 3      | 2
 3      | 15
 .      | .       
 .      | .       
 .      | .       

最佳答案

毫无疑问,多对多是更好的设计。

第一种设计使编写查询变得困难。考虑以下例行查询。

  1. 指定用户是否属于指定组?为此,您必须对每个组使用不同的查询。这是不希望的。此外,如果您使用组的列名称,则组列表是数据库架构的一部分,而不是数据的一部分,其中用户是数据。
  2. 指定用户属于哪些组?您可以简单地返回单行,尽管许多应用程序可能更喜欢(并且精通)迭代结果集。迭代列的子集是可行的,但不自然。
  3. 指定组包含哪些用户?现在您回到每个组的不同查询。 我将把这些东西的演示留给读者作为练习。 SQL 数据库近似的关系模型旨在处理关系和键(表和主/外键)。信息应作为数据(而非元数据)存在于一处(且仅一处)。多列方法缺乏标准化,将成为 future 维护的难题。

注意:我编辑了此响应以纠正我对原始代码的误读。然而,评论的主旨是相同的。第二个(多对多)是要走的路。

关于mysql - 数据库设计。一对多还是多对多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34730703/

相关文章:

SQL 条件插入和其他以原子/全部或无/非交错方式完成的多个查询

mysql - 如何在 MySQL 中将字符串转换为日期时间格式

mysql - 如何在 SELECT 语句中使用 SQL 值作为其列名?

php - 如何消除MySQL中重复的​​搜索结果?

mysql - 在这种情况下如何在 SQL 中使用 GROUP BY 和 COUNT

mysql - 如何按时间范围对员工进行分组?

php - 在保存到 mysql 的 php 脚本中转义引号的最佳方法是什么?

sql - 如何从表中随机选择唯一的行对?

sql - 有机会从 varchar 列恢复 unicode 数据

sql - 如何编写一个简单的数据库引擎