我正在为一个网站的用户配置文件系统工作,并且正在思考什么是一种更好的(可伸缩的)方法。我已经提出了两种解决方案,正在寻找任何输入或者可能指向我可能错过的东西。选择一种方法来存储用户配置文件?
下面的create table语句并不是可执行的,但仅仅是为了给出所涉及的表格布局的概念。
我最初的想法是这样的:
CREATE TABLE user(
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
user_email VARCHAR(320),
user_joined DATATIME,
user_last_seen DATATIME,
user_name_first VARCHAR,
user_name_last VARCHAR,
user_name_alias VARCHAR,
user_location_country VARCHAR,
user_location_region VARCHAR,
user_location_city VARCHAR
# ...
);
显然,这是不是在所有非常可扩展性和增加额外的属性我讨厌。一个好处是我可以快速搜索匹配特定属性的用户。我已经做了一些四处看看,这是一个很常见的方法(例如Wordpress)。
我的第二个方法(一个我目前正在玩弄)是更具可扩展性,但我有点担心的性能:
CREATE TABLE user(
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
user_email VARCHAR(320)
);
CREATE TABLE user_profile(
user_id INT UNSIGNED NOT NULL,
visibility ENUM('PRIVATE', 'PUBLIC'),
name VARCHAR,
value VARCHAR
);
使用这种方法每次使用都有一套键值与它关联的对,这使得添加其他属性变得不重要,以及在登录时加载用户配置文件。然而,我失去了第一种方法中的所有类型信息(例如,DATETIME现在以格式化字符串的形式存储),所以一些搜索变得烦人。这确实给了我更多的选择用户想公开显示的属性的控制权。
混合方法会更好地让我平衡两种方法的优缺点吗? SO使用什么方法?还有没有想过或错过的另一种方法?
扩展:采用一种混合的方法会是有利的,也插入来自用户表的属性到user_profile表来控制自己的知名度给其他用户,或者可以说有可能被看作是额外的开销?
它让我感到(并纠正我,如果我错了),这种方法会随着时间的推移而受到'表膨胀'与大量的表被添加到数据库添加不同的功能? – 2009-01-09 23:30:16
我不确定那张桌子是否真的有问题。如果你有一个拥有1000个特征点但只有5个表的应用程序,我会对表格的规范化持怀疑态度。 Martin Fowler在这里讨论表模块设计模式:http://martinfowler.com/eaaCatalog/tableModule.html – DavGarcia 2009-01-09 23:51:19