将标签与实体相关联,将标签存储一次或不存储?

时间:2010-04-12 20:47:48

标签: sql

考虑我有一张带有注释的表,可以与零个或多个标签相关联,我将如何决定

create table notes (
  id int , -- primary key
  -- other fields
);
create table tagmapping (
 noteid int, -- refers notes.id
 tagid int, -- refers tags.id
 );
create table tags (
  int id, -- primary key
  tagname varchar(255)
);

vs可能会多次存储相同的标签

create table notes (
  int id, -- primary key
  -- other fields

);

create table bar (
  id id, -- primary key
  tag varchar(255),
  -- other fields
  noteid int -- refers to notes.id, (not unique)
);

我会采用哪种混乱/优势进行最后一种方法?

3 个答案:

答案 0 :(得分:1)

第一种方式是实现多对多关系的标准方式。你应该这样做,因为这会给人们带来最大的惊喜。

第二种方法有几个问题:

  • 您必须复制标记名称,这会引入冗余。如果标签名称很长,则可能浪费磁盘空间。
  • 如果您想要重命名标记,则必须更新整个表而不是仅更新一个字段。

答案 1 :(得分:0)

对于第二种方法:

  1. 查询(对于报告等)更难,因为标签可能会拼写错误以及其他类似的东西
  2. 速度。查询int比使用字符串
  3. 更快
  4. 如果您需要重命名代码,该怎么办?您必须手动或通过一系列查询在每个笔记中重命名

  5. 存储重复数据通常被认为是DBA和开发人员的不良做法。最好随时<{3}}

答案 2 :(得分:0)

当您需要更改标记或向标记添加属性时,第二种解决方案的缺点部分会自行解决。假设您有一个名为“Foo”的标记,您现在希望添加一个属性,以便您确定标记是否处于活动状态。在第二种方法中没有办法做到这一点。您必须在表示层中强制执行“魔术标记名称”。此外,您无法在标记上强制执行一致的命名。有人可以添加一个名为“Foo”的标签和另一个名为“Fu”的标签,即使它们应该是相同的标签。