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,请查看手册并考虑一下,特别是如果您要对该列建立索引的话。