2010-04-12 70 views
2

考虑我有可能与零个或多个标签进行关联的说明表,我会怎么决定做将标签与实体关联,存储标签一次或不存在?

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) 
); 

什么混乱/优势,我会让自己进入最后的做法?

回答

1

第一种方法是实现多对多关系的标准方式。你应该这样做,因为这会让人感到惊讶。

一对夫妇与第二种方法的问题:

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

对于第二种方法:

  1. 它更难对查询(报表和这样),因为标签可以潜在地拼写错误和其他类似的东西
  2. 速度。对int进行查询比查询字符串要快得多
  3. 如果您需要重命名标签,该怎么办?您必须手动或通过一系列查询在每一个音符中对其进行重命名

  4. 存储重复数据在DBA和开发人员之间通常被认为是不好的做法。这是最好始终遵循normalization rules时,你可以

0

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