一个或多个表用于存储键值对?

时间:2012-11-22 11:08:43

标签: sql database-design key

我正在尝试在这两个表设计之间进行选择,性能是特权(使用关节查询)

多个表:每个项目(或键)都有自己的表

CREATE TABLE users_languages (
    "user_id" bigint not null,
    "language" integer not null,
    primary key ("user_id", "language"),
    foreign key ("user_id") references users ("user_id") on delete cascade
);

一个KVP表:包含所有项目/密钥

CREATE TABLE users_kvp (
    "user_id" bigint not null,
    "key" varchar not null, -- could be "language" or other
    "value" integer not null,
    primary key ("user_id", "key", "value"),
    foreign key ("user_id") references users ("user_id") on delete cascade
);

我认为对于大多数操作来说,最后一个会慢一些,对吗?如果是,多少和何时?

1 个答案:

答案 0 :(得分:1)

从对问题的评论来看,规范化的关系数据结构看起来最符合您的要求。这样的表结构可能类似于:

Users
-----
UserID (PK)
UserName
... (other attributes)

Languages
---------
LanguageID (PK)
LanguageName

UserLanguage
------------
UserID (PK)
LanguageID (PK)

可以将所有用户的语言放到Users表中(如Language1,Language2等),但这只是denormalisation的一个例子 - 在我看来,从提供的信息,这对你的要求是不合适的。