2

我有两张桌子A和B。

哪种设计更可取?

(一体)

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

或(分开)

表 A:类别 || 子类别

表 B:文章 ID || 子类别

查询 ALLINONE:

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

查询 SEPARATED:

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

ALL in ONE 直截了当,但 SEPARATED 更干净。

哪个更快,更推荐?

4

4 回答 4

2

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

第二个版本指向层次结构的最低级别,然后通过它指向更高级别。

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

(至少)有一种情况是您不想这样做。有时,类别和子类别之间的关系会随着时间变化,您希望在给定的时间点保持这种关系。这被称为渐变维度。在这种情况下,您可能希望在单个记录中捕获有关子类别和类别的所有信息。

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

于 2013-07-02T01:42:02.620 回答
0

对于您显示的示例查询,如果您使用单个表并在三列 ( article_id, category, subcategory) 上定义多列索引,它可能会更快。

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

PS:SQL中没有==运算符。

于 2013-07-02T01:27:59.680 回答
0

请不要过早优化。从规范化表格开始或提供更多真实信息!

于 2013-07-02T01:16:14.327 回答
0

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

于 2013-07-02T02:54:23.463 回答