紧凑与宽松的数据库

时间:2013-07-02 01:03:42

标签: database-design

我有两张桌子A和B.

哪种设计更可取?

(一体化)

  

表A:文章ID ||类别||子类别

或(分开)

  

表A:类别||子类别

     

表B:文章ID ||子类别

查询ALLINONE:

Select article_id from tableA where article id = foo and
  Category = bar and sub category = baz;

查询已分离:

Select article_id from tableB inner join tableA 
  where tableA.sub-category = tableB.sub-category and tableA.category = Category;

ALL in ONE直接指向了这一点,但是SEPARATED更加干净。

哪个更快,更推荐?

4 个答案:

答案 0 :(得分:2)

第一个版本是将所有层次结构信息存储在单个记录中

第二个版本指向层次结构的最低级别,然后将其引用到更高级别。

一般而言,更规范化的方法(第二种方法)是表达这种关系的更“自然”的方式。例如,您所谓的“子类别”可以是“产品”,“类别”可以是“产品”的属性。将产品存储在单独的表中非常有意义。

当你不想这样做时,至少有一种情况。有时,类别和子类别之间的关系会随着时间的推移而发生变化您希望在给定的时间点维持关系。这称为缓慢变化的维度。在这种情况下,您可能希望在单个记录中捕获有关子类别和类别的所有信息。

换句话说,不可能说总体上哪个设计更好。通常,第二种方法(更规范化)解决了更多业务问题。在某些情况下,第一个可能更具吸引力。

答案 1 :(得分:0)

不要过早优化。从标准化表开始或提供更多真实信息!

答案 2 :(得分:0)

对于您显示的示例查询,如果您使用单个表,并在三列(article_idcategory,{{1}上定义多列索引,则可能会更快})。

但请记住,您可能希望稍后针对同一个表运行另一个查询,并且它将受益于不同的组织和索引。 我们根据查询决定性能优化,而不是表格。因此,对您查询数据的所有方法进行一些分析是值得的。

PS:SQL中没有subcategory运算符。

答案 3 :(得分:0)

如果您的分类如此简单且基本。即每个文章只能在一个类别中找到,并且您的类别没有层次结构,您可以使用一个表格的第一个设计。否则,您必须使用其他设计。