有人在数据库中存储键值对有经验吗?

我一直在使用这种类型的表:

CREATE TABLE key_value_pairs (
    itemid           varchar(32) NOT NULL,
    itemkey         varchar(32) NOT NULL,
    itemvalue       varchar(32) NOT NULL,
    CONSTRAINT ct_primarykey PRIMARY KEY(itemid,itemkey)
)

然后,例如,可能存在以下行:
 itemid            itemkey        itemvalue
 ----------------  -------------  ------------
 123               Colour         Red
 123               Size           Medium
 123               Fabric         Cotton

这种方案的问题在于提取数据所需的SQL语法非常复杂。
仅创建一系列键/值列会更好吗?
CREATE TABLE key_value_pairs (
    itemid            varchar(32) NOT NULL,
    itemkey1        varchar(32) NOT NULL,
    itemvalue1      varchar(32) NOT NULL,
    itemkey2        varchar(32) NOT NULL,
    itemvalue2      varchar(32) NOT NULL,
 . . .etc . . .
)

这将更容易,更快捷地进行查询,但是缺少第一种方法的可扩展性。
有什么建议吗?

最佳答案

在继续您的方法之前,我谨建议您退后一步,考虑您是否真的要将此数据存储在“键值对”表中。我不知道您的应用程序,但是我的经验表明,每次完成您的操作后,我希望以后创建一个颜色表,织物表和尺寸表。

考虑一下参照完整性约束,如果您采用键值对方法,则当您尝试在size字段中存储颜色id时,数据库将无法告诉您

考虑一下在具有10个值的表上联接的性能优势,而在多个域中可能有成千上万个值的普通值。关键值索引真正有用吗?

通常,做您正在做的事情的原因是因为域需要是“用户可定义的”。如果是这样,那么即使是我也不会敦促您快速创建表(尽管这是可行的方法)。

但是,如果您的推理是因为您认为它比多张表更易于管理,或者因为您正在设想一个适用于所有域的维护用户界面,那么请停下来并认真思考,然后再继续。

关于sql - 关系数据库中的键值对,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/126271/

10-11 20:32