【问题标题】:One column SQL table, the column being an ID - is this crazy?一列 SQL 表,该列是一个 ID - 这很疯狂吗?
【发布时间】:2013-10-17 03:40:42
【问题描述】:

我正在设计一个用于国际化内容的数据库。其中一个功能是标记系统,类似于 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 填充该列?

【问题讨论】:

  • @kinakuta 然后我们复制英文标签名称....想想如果标签名称稍后被修改怎么办?然后我们是更新翻译和名称还是只更新翻译?我想避免重复。如果(在某些时候)我们有其他语言的标签名称但没有英文怎么办?然后我们的标签列中就有了多语言标签名称。
  • @kinakuta 呵呵。那么“木工”的英语和西班牙语翻译没有相同的 ID。参照完整性被破坏。看看我在反对什么?
  • 如果标签具有超出词汇名称的某种身份,这就是您在这里暗示两个词可以指代同一事物的暗示,那么这就是必须进入标签表的内容.无论是创造者,创造的时间,还是什么,这都是你需要决定的,因为你现在已经将它定义为一个词以外的东西。
  • 同一个词用于多种语言怎么办?
  • 这出现在最近的一个问题here 中,有人意识到他们实际上并不了解他们的员工,这在某些时候可能不会改变 - 渐渐地,每个领域似乎都必须如此移至具有 EffectiveDates 的历史记录表(甚至名称都可以更改!)。

标签: mysql database-design internationalization


【解决方案1】:

正如我在我对 OP 的 cmets 中所说的那样,几年前我完全遇到了同样的问题。不过,我使用的是 SQL Server 而不是 MySql,但问题是一样的。

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

【讨论】:

  • Cesar - 这适用于 MySQL - 刚刚测试过 - INSERT INTO tbl_name () VALUES();
  • 希望 SQLServer 也是如此 = )
  • 在 SQL Server 中:INSERT INTO tbl 默认值;
  • @dportas:哇,我不知道。可惜现在有点晚了,但还是非常感谢!
【解决方案2】:

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,请查看手册并考虑一下,尤其是当您要为该列编制索引时。

【讨论】:

    【解决方案3】:
    INSERT INTO tbl_name () VALUES(); 
    

    【讨论】:

    • INSERT INTO tbl_name VALUES() 就足够了。服务器将尝试将所有列设置为其各自的默认值或自动值。
    猜你喜欢
    • 2013-06-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-13
    • 1970-01-01
    • 2014-01-20
    相关资源
    最近更新 更多