Database design 紧凑型与松散型数据库
我有两张桌子A和B 哪种设计更可取 (一应俱全) 表A:物品ID | |类别| |子类别 或(分开) 表A:类别| |子类别 表B:物品ID | |子类别 查询ALLINONE: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
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非规范化之前,您可以将数据缓存在某个地方(比如静态生成页面、前端缓存等)(另外:搜索规范化与非规范化表的优缺点。)