2011-06-20 16 views
0

我有一个数据库,它存储了一些用户。每个用户都有其帐户设置,隐私设置和许多其他属性设置。这些房产的数量开始增长,我最终可能会购买30个物业。直到现在,我还是把它保存在“UserInfo”表中,该表具有与One-To-Many相关的User和UserInfo(记录所有更改)。将它放在单个“UserInfo”表中听起来不太好,至少在数据库模型中,它看起来很乱。什么是解决方案?组织数据库表 - 大量的属性

将隐私设置,帐户设置和设置的其他“组”设置分隔开并在UserInfo和每组设置表之间具有1-1关系是一种解决方案,但是当这种解决方案太慢(或慢得多)时检索数据?我想所有的数据都不会在同一时间在单个页面上显示。因此,也许每个表具有一对多的关系也是一个解决方案(保持每个组的日志分开)?

回答

1

如果只有30个属性,我建议只创建30列。对于现代数据库来说,这并不算太多。

但是我猜如果你今天有30个房产,随着时间的推移,你会继续发明新的房产,并且列数将会持续增长。每天重组您的表以添加列可能会因为您获得大量行而变得非常耗时。

如需其他解决方案,请查看此博客,以获取以“无模式”方式存储大量动态属性的漂亮解决方案:How FriendFeed Uses 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'; 

这意味着当你在用户插入或更新行,还需要插入或更新您的每一个辅助表,与您的数据保持同步。随着您添加更多辅助表格,这可能会变成一件复杂的事情。