我有3张表存储了来自用户注册的常用数据:语言,国家/地区,国籍。每个表都有字段: id 和名称。
我有一个主表用户,它存储了几乎所有用户的数据。
另一个名为 tableregistry 的表,它具有以下结构:
id | tableName | tableValue
1 | finalJoin | 0
2 | language | 1
3 | country | 2
4 |nationality| 3
还有一个存储称为巧合共享许多用户的常见数据:
id | idUser | nTable | cValue
因此,如果我们有第80位用户在荷兰生活,但他是来自秘鲁的本地人并且会说Chinesse数据会以这种方式保存(考虑到荷兰在国家表中拥有id 20,秘鲁国籍在国籍表中有id 34,而中文在语言表上有id 22
198 | 80 | 2 | 20
199 | 80 | 3 | 34
200 | 80 | 1 | 22
因此,如果我们想要对人进行搜索,我会使用存储过程搜索巧合,只需获得3个临时表即可获得用户1.来自某个国家/地区的常用数据。任何国家,不是本地人,也不是说某种语言。
使用表格用户对这些临时表进行多次加入,我们会得到此搜索的用户列表。
问题是。会更好地使用视图还是只保留临时表策略?
答案 0 :(得分:0)
你有一个奇怪的架构。怎么样:
CREATE TABLE users (
id int(11) not null auto_increment,
...
);
CREATE TABLE languages (
id int(11) not null auto_increment,
name varchar(20) not null
);
CREATE TABLE countries (
id int(11) not null auto_increment,
name varchar(20) not null
);
CREATE TABLE nationalities (
id int(11) not null auto_increment,
name varchar(20) not null
);
CREATE TABLE user_rel_languages (
user_id int(11) not null,
language_id int(11) not null
);
CREATE TABLE user_rel_countries (
user_id int(11) not null,
country_id int(11) not null
);
CREATE TABLE user_rel_nationalities (
user_id int(11) not null,
nationality_id int(11) not null
);
因此,要获得具有特定语言+国家/国籍配置的用户,您可以从users
中进行选择,并通过关系表连接每个表。 E.g:
select u.* from users u
join user_rel_countries urc on urc.user_id = u.id
join user_rel_languages url on url.user_id = u.id
join user_rel_nationalities urn on urn.user_id = u.id
where country_id = 1 and language_id = 2 and nationality_id = 3
group by u.id ;
或者如果你不关心非规范化,你可以放弃countries
和user_rel_countries
之间的区别