一列SQL表,该列是一个ID - 这是疯了吗?

时间:2011-06-26 01:08:48

标签: mysql database-design internationalization

我正在设计一个用于国际化内容的数据库。其中一个功能是标记系统,类似于Stack Overflow所具有的功能。这就是我所拥有的:

TABLE tags
tag_id | int(11) unsigned | NOT NULL   | PRI | auto_increment 

TABLE tag_translations
| tag_translation_id | int(11) unsigned | NOT NULL   | PRI | auto_increment 
| fk_language_id     | int(11) unsigned | NOT NULL   | MUL |                
| fk_tag_id          | int(11) unsigned | NOT NULL   | MUL |                 
| tag_name           | varchar(255)     | NOT NULL   | UNI |  

TABLE tag_relationships
| tag_relationship_id | int(11) unsigned | NOT NULL   | PRI | auto_increment
| fk_tag_id           | int(11) unsigned | NOT NULL   | MUL | 
| fk_solution_id      | int(11) unsigned | NOT NULL   | MUL |  

首先,让标签表只包含一个ID似乎是合理的吗?其次,我如何填充该列,唯一的字段是自动递增ID?

3 个答案:

答案 0 :(得分:2)

正如我在对OP的评论中所说,几年前我完全完全相同的问题。我使用的是SQL Server而不是MySql,但问题是一样的。

不幸的是,我找到的唯一解决方案是在Tags表中添加额外的列。我决定添加一个DateCreated列,最终证明它是有用的。

答案 1 :(得分:1)

Q1:不,我看不出tags表的重点。这似乎没有任何意义。如果你无法解释该表中行的语义值(该表中的条目在现实世界中代表什么?),那么它可能不属于。我怀疑它只是为了给你auto_increment,这不是一个好的答案。您可以指定自己的ID。

Q2:已经回答了。

我也看不到tag_translation_idtag_relationship_id的用途。习惯性地使用auto_increment

我认为我对基本结构所做的是:

create table tag_translations (
  tag_id int not null,
  language_id int not null,
  tag_name varchar(255),
  primary key (tag_id, language_id)
);

create table tag_relations (
  tag_id int not null,
  solution_id int not null,
  primary key (tag_id, solution_id)
);

我根据需要添加元数据和索引。由于服务器的'Using index' optimization:

,两个列索引非常适合tag_relations等联结。
  

使用索引

     

检索列信息   从表中仅使用信息   在索引树中无需做   另外寻求阅读实际   行。这个策略可以在何时使用   查询仅使用列   单个索引的一部分。

顺便说一下,对于国际化系统,255不是varchar字段长度的幻数,除非您坚持使用单字节编码。如果您使用的是UTF-8,请查看手册并考虑一下,特别是如果您要为该列编制索引。

答案 2 :(得分:0)

INSERT INTO tbl_name () VALUES();