2016-03-13 37 views
0

可以为我的自制博客提供一个类别列表吗?我真的不知道这张桌子还有什么应该。类别的单列表

该表格将与posts表具有多对多的关系。

我的推理是我不想要相同的类别,并以这种方式我的类别也将是主键。

+0

也许你可以有CategoryID(** INT **)_AI_ _PK_,CategoryName(** varchar **)_not null_,这样你就可以使用CategoryID来引用文章中的类别..使用内部或左边加入 –

+2

我想到了这一点。但我的想法是,我只是为了添加它而添加一个id。 CategoryName是一个完美的候选关键,因为它的独特性。并在那里它可能是一个主键 –

+2

有一个ID将是高效率和灵活的情况下,你想即兴..例如突然一个月后,你觉得需要添加父a和子类别..所以只需添加一列该表将完成工作.....所以完整的表看起来像..类别ID(** INT **)_AI_ _PK_,类别名称(** varchar **)_不空,ParentID(** int **) ..你可以用这个建立一个树形视图..当处理数据库时,单独有一个ID字段总是可以帮助@morten –

回答

1

我想补充一个代理键2个主要原因:

  1. 使用代理键将使您的加入对整数工作,而然后在字符串,这是更有效的
  2. 使用代理键意志使您能够重命名类别,而不必遍历与该类别相关的所有行并更改它们。我知道大多数现代数据库都允许更新级联,但即使您不需要手动完成更新,也需要在数据库方面进行更多的工作。

当然,您还必须在类别名称上保留一个唯一索引,并将其标记为非空值,否则最终可能会有2个相同类别名称的ID或一个类别名称为ID的ID一片空白。

+1

原因2对我来说足够好。 – Strawberry

+0

在阅读a_horse_with_no_name对其他答案的评论后编辑了我的答案。当然,我应该自己想想。 –

0

从逻辑上讲,如果您想在录制帖子之前预先定义类别,则使用名称作为关键字的单列表格没有问题。如果类别不能存在没有帖子,你甚至不需要这个单列表。

实际上,名称不如代理键稳定。除非您期望大数据集,否则您的数据库管理系统不支持ON UPDATE CASCADE,或者您设计数据库效果不佳,这并不是什么问题。如果您的类别名称很长,并且您期望数据量庞大,那么记录大小,索引大小和联接性能可能会成为问题。另一方面,使用类别名称直接否定联接(使用类别表获取名称)。您根据What are the design criteria for primary keys?

中指定的其他标准选择关键分数以得出结论,单列表格对您指定的要求很合适。

+1

使用代理键的总指数大小实际上会更高。代理键的一个索引和类别名称上的另一个(唯一)索引。 –

+0

对于类别表,是的,但对于相关表格较小。 – reaanb