其他答案巧妙地概述了您各种选择的利弊。
我相信您的选项 1(财产袋)是大多数应用程序的最佳整体设计,特别是如果您针对财产袋的弱点建立了一些保护措施。
请参阅以下 ERD:
![属性包 ERD](https://i.stack.imgur.com/My1Hp.jpg)
在上面的 ERD 中,该USER_SETTING
表与 OP 非常相似。不同之处在于,此设计没有 varcharCode
和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_VALUE
的 s 中挑选,还是需要输入 s USER_SETTING.unconstrained_value
。允许用户使用其设置的 GUI 需要了解提供哪个选项以及如何强制执行 theSETTING.data_type
和 themin_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中看到这个。