其他答案巧妙地概述了您的各种选择的利弊。
我相信您的选项 1(财产袋)是大多数应用程序的最佳整体设计,特别是如果您针对财产袋的弱点构建了一些保护。
请参阅以下 ERD:
在上面的 ERD 中,USER_SETTING 表与 OP 非常相似。不同之处在于,此设计没有 varchar Code 和 Value 列,而是对 SETTING 表进行了 FK,该表定义了允许的设置(代码)和值的两个互斥列。一个选项是可以接受任何类型用户输入的 varchar 字段,另一个选项是合法值表的 FK。
SETTING 表还有一个标志,指示用户设置是应该由 FK 定义还是由不受约束的 varchar 输入定义。您还可以将data_type 添加到SETTING 以告诉系统如何编码和解释USER_SETTING.unconstrained_value。如果您愿意,您还可以添加SETTING_GROUP 表来帮助组织用户维护的各种设置。
这种设计允许您围绕您的设置制定规则。这方便、灵活且易于维护,同时避免了混战。
编辑:更多细节,包括一些例子......
请注意,上面的 ERD 已经增加了更多的列详细信息(SETTING 上的范围值和 ALLOWED_SETTING_VALUE 上的列)。
这里有一些示例记录用于说明。
SETTING:
+----+------------------+-------------+--------------+-----------+-----------+
| id | description | constrained | data_type | min_value | max_value |
+----+------------------+-------------+--------------+-----------+-----------+
| 10 | Favourite Colour | true | alphanumeric | {null} | {null} |
| 11 | Item Max Limit | false | integer | 0 | 9001 |
| 12 | Item Min Limit | false | integer | 0 | 9000 |
+----+------------------+-------------+--------------+-----------+-----------+
ALLOWED_SETTING_VALUE:
+-----+------------+--------------+-----------+
| id | setting_id | item_value | caption |
+-----+------------+--------------+-----------+
| 123 | 10 | #0000FF | Blue |
| 124 | 10 | #FFFF00 | Yellow |
| 125 | 10 | #FF00FF | Pink |
+-----+------------+--------------+-----------+
USER_SETTING:
+------+---------+------------+--------------------------+---------------------+
| id | user_id | setting_id | allowed_setting_value_id | unconstrained_value |
+------+---------+------------+--------------------------+---------------------+
| 5678 | 234 | 10 | 124 | {null} |
| 7890 | 234 | 11 | {null} | 100 |
| 8901 | 234 | 12 | {null} | 1 |
+------+---------+------------+--------------------------+---------------------+
从这些表中,我们可以看到一些可以确定的用户设置是最喜欢的颜色、项目最大限制和项目最小限制。最喜欢的颜色是字母数字的选择列表。项目最小和最大限制是设置了允许范围值的数字。 SETTING.constrained 列确定用户是从相关的ALLOWED_SETTING_VALUEs 中选择还是需要输入USER_SETTING.unconstrained_value。允许用户使用其设置的 GUI 需要了解提供哪个选项以及如何强制执行 SETTING.data_type 和 min_value 和 max_value 限制(如果存在)。
使用这种设计,您可以表格驱动允许的设置,包括足够的元数据,以对用户选择(或输入)的值执行一些基本的约束/健全性检查。
编辑:示例查询
下面是一些示例 SQL,使用上述数据列出给定用户 ID 的设置值:
-- DDL and sample data population...
CREATE TABLE SETTING
(`id` int, `description` varchar(16)
, `constrained` varchar(5), `data_type` varchar(12)
, `min_value` varchar(6) NULL , `max_value` varchar(6) NULL)
;
INSERT INTO SETTING
(`id`, `description`, `constrained`, `data_type`, `min_value`, `max_value`)
VALUES
(10, 'Favourite Colour', 'true', 'alphanumeric', NULL, NULL),
(11, 'Item Max Limit', 'false', 'integer', '0', '9001'),
(12, 'Item Min Limit', 'false', 'integer', '0', '9000')
;
CREATE TABLE ALLOWED_SETTING_VALUE
(`id` int, `setting_id` int, `item_value` varchar(7)
, `caption` varchar(6))
;
INSERT INTO ALLOWED_SETTING_VALUE
(`id`, `setting_id`, `item_value`, `caption`)
VALUES
(123, 10, '#0000FF', 'Blue'),
(124, 10, '#FFFF00', 'Yellow'),
(125, 10, '#FF00FF', 'Pink')
;
CREATE TABLE USER_SETTING
(`id` int, `user_id` int, `setting_id` int
, `allowed_setting_value_id` varchar(6) NULL
, `unconstrained_value` varchar(6) NULL)
;
INSERT INTO USER_SETTING
(`id`, `user_id`, `setting_id`, `allowed_setting_value_id`, `unconstrained_value`)
VALUES
(5678, 234, 10, '124', NULL),
(7890, 234, 11, NULL, '100'),
(8901, 234, 12, NULL, '1')
;
现在是提取用户设置的 DML:
-- Show settings for a given user
select
US.user_id
, S1.description
, S1.data_type
, case when S1.constrained = 'true'
then AV.item_value
else US.unconstrained_value
end value
, AV.caption
from USER_SETTING US
inner join SETTING S1
on US.setting_id = S1.id
left outer join ALLOWED_SETTING_VALUE AV
on US.allowed_setting_value_id = AV.id
where US.user_id = 234
在SQL Fiddle 中查看此内容。