MySQL Temp Tables还是View?

时间:2013-02-16 00:37:15

标签: mysql views temp-tables

我有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.来自某个国家/地区的常用数据。任何国家,不是本地人,也不是说某种语言。

使用表格用户对这些临时表进行多次加入,我们会得到此搜索的用户列表。

问题是。会更好地使用视图还是只保留临时表策略?

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 ;

或者如果你不关心非规范化,你可以放弃countriesuser_rel_countries之间的区别