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

Cal*_*dge 6 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 |  
Run Code Online (Sandbox Code Playgroud)

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

小智 1

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

Q2:已经回答了。

我也不明白tag_translation_id和 的tag_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)
);
Run Code Online (Sandbox Code Playgroud)

我将根据需要添加元数据和索引。两列索引非常适合连接,例如tag_relations由于服务器的“使用索引”优化:

使用索引

仅使用索引树中的信息从表中检索列信息,而无需执行额外的查找来读取实际行。当查询仅使用属于单个索引的列时,可以使用此策略。

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