Php 我应该如何存储只有几个可能值的实体?

Php 我应该如何存储只有几个可能值的实体?,php,sql,database,Php,Sql,Database,我应该如何存储用户的性别、宗教、政治观点等数据,这些数据是从2-8个最大值列表中选择的,如“男性”、“女性”或“东正教”、“穆斯林”、“犹太教”、“天主教”等?此外,该值是常量,即使管理员也不能将“女性”更改为其他值。在数据库中,存储一个只有这2-8个值的类似表,并在外键上与父表进行联接,这看起来很奇怪。第二种方法-程序代码中的特殊对象-但将程序逻辑与数据混合总是不好的。它必须放在表中,即使它使您进行连接。连接将通过PK完成,因此几乎没有开销某些东西看起来是否奇怪取决于个人偏好或设计结构。然而,

我应该如何存储用户的性别、宗教、政治观点等数据,这些数据是从2-8个最大值列表中选择的,如“男性”、“女性”或“东正教”、“穆斯林”、“犹太教”、“天主教”等?此外,该值是常量,即使管理员也不能将“女性”更改为其他值。在数据库中,存储一个只有这2-8个值的类似表,并在外键上与父表进行联接,这看起来很奇怪。第二种方法-程序代码中的特殊对象-但将程序逻辑与数据混合总是不好的。

它必须放在表中,即使它使您进行连接。连接将通过PK完成,因此几乎没有开销

某些东西看起来是否奇怪取决于个人偏好或设计结构。然而,在数据库中存储任何与数据有关的内容是完全合乎逻辑的。即使是一组给定的选项也可能在遥远或不太遥远的未来发生变化。我无法计算客户要求我每天、每周、甚至几年内更改一组选项的次数,因为他们已经确保这些选项永远不会更改

将选项列表存储在单独的表中是关系数据库设计的一部分。在我看来,关系数据库设计使得获得一组数据变得很容易,这些数据以任何方式包括甚至排除了选项

我建议用一种好的、老式的方式来做,例如:

表用户id、用户名称 表选项id,选项标签 表用户\选项id、用户\ id、选项\ id 同时是男性和天主教徒的用户将与两个选项相关:

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`

数据库中可能存在的重复存储一个只有2-8个值的类似表,并在外键上与父表进行连接,这看起来很奇怪-我强烈反对,这正是数据应该如何存储在规范化良好的关系数据库中。我们有数百个这样的表,虽然有些超过8行,但在我们的大多数数据库中,它们都只有2列。你不需要加入,只要有外键就可以了!我认为这不是一个很好的答案。请解释开销很少的原因以及OP如何实现这一点。说它必须放在表格中并不是一个真正的答案。哇,真的是一个非常有用的想法,我有很多专栏,比如政治观点、宗教观点、个人观点、吸烟观点,这些都带有杂乱的下划线,所以我决定把它们移到视图表格中,但为了更好的结构,我把性别分开