Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database design 紧凑型与松散型数据库_Database Design - Fatal编程技术网

Database design 紧凑型与松散型数据库

Database design 紧凑型与松散型数据库,database-design,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 wher

我有两张桌子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;
一体式设计直达主题,但分离式设计更为简洁


哪一种更快更推荐?

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

对于您显示的示例查询,如果使用单个表,并在三列上定义多列索引(
article\u id
category
subcategory

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


PS:SQL中没有
=
运算符。

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

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

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

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


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

如果你的分类如此简单和基本。i、 e每一篇文章只能在一个类别中找到,并且你的类别没有层次结构,你可以使用一个表的第一个设计。否则,您必须使用另一种设计。

我不知道您在问什么。真实数据、真实表结构、真实查询-请。@o2kevin:)啊,真遗憾我不能发表评论。@drc在评论中说。不管怎样,你的意思是“请不要过早优化”吗?那么你选择的是选项B吗?是选项B,正如@Bill karwin所说的,你应该对你的真实查询进行分析,我打赌这些只是你将拥有的一个有限的例子,在这些情况下,过早优化意味着您在分析问题的某一部分时超出了您的能力,您仍然不应该关心这些问题,从规范化表开始,看看您的应用程序如何处理所有负载以及在哪里进行优化,通常是80-20规则帮助,通常是在web应用程序中(您的应用程序是webapp,不是吗?)在开始db非规范化之前,您可以将数据缓存在某个地方(比如静态生成页面、前端缓存等)(另外:搜索规范化与非规范化表的优缺点。)