我有一个数据库,其中存储了一些用户。每个用户都有自己的帐户设置、隐私设置和许多其他属性需要设置。这些房产的数量开始增长,我最终可能拥有30处左右的房产
到目前为止,我一直把它保存在"UserInfo"表中,其中User和UserInfo作为一对多相关(记录所有更改)。把它放在一个"UserInfo"表中听起来不太好,至少在数据库模型中,它看起来会很乱。解决方案是什么?
将隐私设置、帐户设置和其他"组"设置分离在单独的表中,并在UserInfo和每组设置表之间建立1-1的关系是一种解决方案,但在检索数据时会不会太慢(或慢得多)?我想所有的数据不会同时出现在一个页面上。所以,也许每个表都有一对多的关系也是一个解决方案(分别记录每组)?
如果只有30个属性,我建议只创建30列。这对于现代数据库来说并不算太多。
但我想,如果你今天有30个属性,随着时间的推移,你会继续发明新的属性,并且列的数量会不断增长。重组表以每天添加列可能会很耗时,因为您会得到很多行。
关于另一种解决方案,请查看本博客,了解一个以"无架构"方式存储大量动态属性的漂亮解决方案:FriendFeed如何使用MySQL。
基本上,将所有属性收集成某种格式,并将其存储在单个TEXT列中。格式是半结构化的,也就是说,如果需要,应用程序可以分离属性,但也可以随时添加更多属性,甚至每行都有不同的属性。XML、YAML或JSON是示例格式,或者应用程序代码语言支持的一些对象序列化格式。
CREATE TABLE Users (
user_id SERIAL PRIMARY KEY,
user_proerties TEXT
);
这使得在给定属性中搜索给定值变得困难。因此,除了TEXT列之外,还要为每个想要搜索的属性创建一个辅助表,其中有两列:给定属性的值,以及返回到找到该特定值的主表的外键。现在您可以对列进行索引,以便快速查找。
CREATE TABLE UserBirthdate (
user_id BIGINT UNSIGNED PRIMARY KEY,
birthdate DATE NOT NULL,
FOREIGN KEY (user_id) REFERENCES Users(user_id),
KEY (birthdate)
);
SELECT u.* FROM Users AS u INNER JOIN UserBirthdate b USING (user_id)
WHERE b.birthdate = '2001-01-01';
这意味着,当您在Users中插入或更新一行时,还需要将其插入或更新到每个辅助表中,以使其与您的数据保持同步。随着添加更多的辅助表,这可能会变成一件复杂的家务事。