我正在设计一个用于国际化内容的数据库。其中一个功能是标记系统,类似于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?
答案 0 :(得分:2)
正如我在对OP的评论中所说,几年前我完全完全相同的问题。我使用的是SQL Server而不是MySql,但问题是一样的。
不幸的是,我找到的唯一解决方案是在Tags表中添加额外的列。我决定添加一个DateCreated列,最终证明它是有用的。
答案 1 :(得分: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)
);
我根据需要添加元数据和索引。由于服务器的'Using index' optimization:
,两个列索引非常适合tag_relations
等联结。
使用索引
检索列信息 从表中仅使用信息 在索引树中无需做 另外寻求阅读实际 行。这个策略可以在何时使用 查询仅使用列 单个索引的一部分。
顺便说一下,对于国际化系统,255不是varchar
字段长度的幻数,除非您坚持使用单字节编码。如果您使用的是UTF-8,请查看手册并考虑一下,特别是如果您要为该列编制索引。
答案 2 :(得分:0)
INSERT INTO tbl_name () VALUES();