|
|
1
3
我认为你有自己的答案,所以我的回答只是想推动你前进。 NoSQL与传统的SQL数据库的主要区别在于 查询计划 . 查询计划是由SQL数据库提供的功能,在该数据库中,它接受查询,对其进行分析,然后将其转换为查找匹配记录并在结果集中返回给您的算法。查询规划涉及到选择最理想的方法,通常通过尽量减少涉及的步骤数、涉及的内存量或将要花费的时间。另一方面,您自己使用nosql。你必须成为一个通宵查询计划专家。 这既是一种恩惠,也是一种负担。对于某些人来说,查询计划是一个复杂的悬崖,您很快就会发现自己在阅读一些令人困惑的东西。但是,如果您正在寻找一个更具技术性的答案,那么它将朝着这个方向发展,即更多地了解数据库如何进行查询规划。 为了加快速度,我将应用与规范化和非规范化相同的常规知识。博伊斯密码子和正常形式1-5等等。NoSQL处于极端非规范化端。您存储的项目的“逻辑”结构是不相关的。使用NoSQL,您的目标不是一个好的传统和直观的模式。您的目标是高效地执行存储操作和查询。 因此,要回答这个问题,您必须从对操作的简单分析开始。枚举应用程序执行的操作。哪些是最频繁的操作?你认为完成哪一项需要最长的时间?通过操作,这里我不讨论低级查询,也不讨论您的数据库在nosql/sql中的模式。这是一个抽象的层次。更抽象地思考。列举“为所有符合这些条件的人加载信息”、“删除那边的人”。我接受了你提到的一些问题,但我没有得到一个明确的列表,这个列表是正确答案中的重要标准。 一旦你列举了这些操作,那么我认为你就更接近回答你的问题了。作为一个玩具例子,考虑一下更新。更新是否频繁?频繁的更新会表明一个对象存储是不好的,因为您必须加载大量不相关的东西,而只是为了更改一个对象的一个属性。考虑粒度。您需要一个对象的所有属性,还是只需要一些属性?想想什么是最频繁的操作?它是否根据某些标准加载对象列表?它是删除还是更新东西?想想什么东西是同时加载的(共定位)。当您加载2级对象的一个实例时,其他实例通常也加载吗?如果没有,那为什么要把它们放在一起呢?远离您的规范化模式,只需忘记它。您需要一个非规范化的模式,以某种方式存储数据,以便优化查询。最终的结果可能与你想象的完全不同。 也许一个好的实验就是这个。伪代码执行实际重载提升的函数。您将直接遇到问题,并确定可能非常慢的功能部分。那么,您的问题的答案基本上就是什么数据结构会真正加速这些部分,或者至少比其他数据结构慢一些。 编辑:一点跟进。NoSQL数据库和非规范化的一个相当违反直觉的特性是,最终可能会多次存储数据。有时在多个地方存储相同的数据是有意义的。因为它加快了查询速度。是的,它为不一致性引入了空间,并违反了SQL的无功能依赖性规则。但是,您可以通过使用多存储事务和一些注意事项来加强数据完整性(一致性)。更详细地说,您想要的存储可能只是您计划执行的查询的文字结果。对。为您计划执行的每个查询创建一个对象存储。在它们之间冗余存储数据。是的,听起来很疯狂和极端。这有点夸张。但是这种方法在使用NoSQL时很常见,并且得到了提升。 编辑:这里有一个粗略的第一次尝试,只是头脑风暴一点,这是一个尝试,给你一个更具体的答案,根据猜测你实际上在做什么。 您需要的是一个名为“设置”的对象存储。存储区中的每个对象都代表一个设置对象。单个设置对象具有设置ID、设置属性名称、设置属性值、级别1属性、级别2属性、级别3属性等属性。
您的基本读取查询可能看起来像
更进一步,您可以使用索引为某些视图进行优化。我们可以在一级属性上创建一个索引,在二级属性上创建一个索引,在一级+二级属性上创建一个索引。 假设您最频繁的操作(需要最快的操作)是加载属于级别1、2和3的特定组合的所有设置。在所有3个上创建一个索引,然后只需遍历该索引即可。 这个头脑风暴示例中的模式是一个单独的对象存储,以及一些索引来加速某些查询。考虑到索引基本上是派生的对象存储,您可以使用实际使用多个存储的概念参数,尽管实际上只使用一个。不管怎样,这可能会变得迂腐。这个例子的要点只是为了证明对象存储的模式与您如何概念化组合和级别的层次结构一点关系都没有。它只与快速执行所需的查询有关。 |
|
|
kamalav · 获取indexedDb配额存储信息 8 年前 |
|
|
Josh · 如何检查indexedDB实例是否打开? 8 年前 |
|
|
Phillip Senn mpgn · 重复命名事务和对象存储 8 年前 |
|
|
John Doe · 如何从数组中获取特定值? 8 年前 |
|
|
Michael S. · IndexedDB-我需要“id”字段吗? 12 年前 |
|
|
Tjorriemorrie · 如何在angularjs中引导异步事件? 12 年前 |