0

我得到了 3 个表,这些表存储了用户注册时的常用数据:语言、国家、国籍。每个表都有字段:idname

我有一个主表users,它几乎存储了来自用户的所有数据。

另一个名为tableregistry的表具有以下结构:

id | tableName | tableValue

 1 | finalJoin | 0

 2 | language  | 1

 3 | country   | 2

 4 |nationality| 3

它存储的另一个称为巧合的是共享许多用户的公共数据:

id | idUser | nTable | cValue

因此,如果我们有第 80 位用户住在荷兰,但他是秘鲁本地人并且说中文,则数据将以这种方式保存(考虑荷兰在国家表中的 id 为 20,秘鲁国籍在国籍表中的 id 为 34,而中文在语言表上的 id 为 22 )

198 | 80    | 2      | 20

199 | 80    | 3      | 34

200 | 80    | 1      | 22

因此,如果我们想要执行人员搜索,我使用存储过程来搜索巧合,公共数据只是获取 3 个临时表来获取用户 1.来自某个国家 2.taht 生活在任何国家,而不是本地和 3。说某种语言。

使用表用户对这些临时表进行多重连接,我们将获得此搜索的用户列表。

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

4

1 回答 1

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通过关系表从这些表中进行选择并加入其中。例如:

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

于 2013-02-16T00:58:19.670 回答