我尝试搜索此内容,但除了设计选择之外,找不到任何其他内容。
所以我的问题就像标题一样。什么更快?创建具有多个列的1个表,或创建具有连接的2或3个(多对多)表。
我喜欢具有多个表的想法,因此数据是分开的。大多数情况下,对于许多喜欢的数据。但是我的朋友告诉我,用布尔值创建5列就可以了。但是我喜欢这样的想法:有一个带有设置的表,然后是一个位于user.id和setting.id之间的表。但是我的问题还在于,它对查询有影响吗?
示例:
Users
- id
- Email
- SettingA
- SettingB
- SettingC
OR示例:
Uers
- id
- email
Users_Settings
- user_id
- setting_id
Settings
- id
- someSettingsValue
Mysql查询数据会更快些吗? (为用户检索设置)
答案 0 :(得分:0)
一点也不..与单个表字段相比,仅2 r 3之间的连接将花费时间。
答案 1 :(得分:0)
这不是要选择具有多个列的单个表还是要选择多个表。是关于归一化的。
根据您提供的模式,如果所有用户始终具有三个设置,即设置A,B和C,则最好使用这三列作为设置来创建单个表。
users table:
+----------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| Email | varchar(128) | NO | | NULL | |
| SettingA | tinyint(1) | NO | | NULL | |
| SettingB | tinyint(1) | NO | | NULL | |
| SettingC | tinyint(1) | NO | | NULL | |
+----------+--------------+------+-----+---------+----------------+
但是,如果保存的任何设置为null,那么最好是为该设置创建一个单独的表,然后再创建一个数据透视表以保持用户的设置而无需主键。
users table:
+-------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| Email | varchar(128) | NO | | NULL | |
+-------+--------------+------+-----+---------+----------------+
settings table:
+---------------+------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------+------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| setting_value | tinyint(1) | NO | | NULL | |
+---------------+------------+------+-----+---------+----------------+
setting_user pivot table:
+------------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+---------+------+-----+---------+-------+
| setting_id | int(11) | NO | | NULL | |
| user_id | int(11) | NO | | NULL | |
+------------+---------+------+-----+---------+-------+
其中setting_user是数据透视表。
在创建模式时,还要考虑一件事,即在扩展应用程序时,总会有三个设置,或者将来还会有更多设置!