我应该如何存储用户的性别、宗教、政治观点等数据,这些数据是从“男性”、“女性”或“东正教”、“穆斯林”、“犹太教”、“天主教”等最大值列表中选择的?而且这个值是不变的,即使管理员也不能将“女性”更改为其他东西。在数据库中,使用这个2-8值来存储类似的表,并在外键上使用父表进行连接看起来很困难。第二种方法--程序代码中的特殊对象--但是将程序逻辑与数据混合总是很糟糕的。
发布于 2015-04-27 14:25:37
是否有什么东西看起来“奇怪”取决于个人喜好或设计结构。但是,在数据库中存储任何与数据有关的内容是完全合乎逻辑的。即使是一套既定的选择,也会在遥远的将来发生变化。我数不清客户要求我每天、一周甚至几年后改变一组选项的次数,因为我已经确保了这套方案永远不会改变。
将选项列表存储在单独的表中是关系数据库设计的一部分。在我看来,关系数据库设计使得获取一组数据变得很容易,这些数据包括甚至排除了各种选项。
我建议你用一种好的、老式的方式来做,例如:
user
(id,user_name)option
(id,option_label)user_option
(id,user_id,option_id)同时为male
和catholic
的用户将与两个选项有关联:
Table user Table option Table user_option
+----+-----------+ +----+--------------+ +----+---------+-----------+
| id | user_name | | id | option_label | | id | user_id | option_id |
+----+-----------+ +----+--------------+ +----+---------+-----------+
| 1 | john | | 1 | male | | 1 | 1 | 1 |
| 2 | melody | | 2 | female | | 2 | 1 | 6 |
| 3 | gerald | | 3 | orthodox | +----+---------+-----------+
+----+-----------+ | 4 | muslim |
| 5 | judaism |
| 6 | catholic |
+----+--------------+
可以使用以下查询来显示每个用户所选的所有选项:
SELECT `u`.*, GROUP_CONCAT( `o`.`option_label` SEPARATOR ', ' ) AS `options`
FROM `user` AS `u`
LEFT JOIN `user_option` AS `uo` ON `uo`.`user_id` = `u`.`id`
LEFT JOIN `option` AS `o` ON `uo`.`option_id` = `o`.`id`
发布于 2015-04-27 13:51:13
它必须放在一张桌子里,即使它让你加入。连接将在PK上完成,因此几乎没有开销。
https://stackoverflow.com/questions/29897562
复制相似问题