我正在为一个网站设计用户个人资料系统,正在考虑采取哪种更好(可扩展)的方法。我想到了两种解决方案,希望得到意见或指出可能遗漏的内容。
以下创建表语句并不可执行,仅用于说明所涉及表格的布局。
我的初步想法是这样的:
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使用哪种方法?还有没有其他方法可以实现这一点,我是否考虑或错过了什么?
扩展:使用混合方法,将用户表中的属性插入到用户资料表中以控制其对其他用户的可见性是否有优势,或者可能被视为额外的开销?