chu*_*ash 28 rdbms postgresql document-oriented mongodb
我目前的项目本质上是一个工厂文件管理系统的运行。
也就是说,有一些皱纹(惊喜,惊喜)。虽然有些问题是项目特有的,但我相信有一些普遍的观察结果和问题没有规范的答案(无论如何我可以找到)并且适用于更广泛的问题领域. 这里有很多,我不确定它是否适合 StackExchange Q&A 格式,但我认为它 a) 一个可回答的问题和 b) 不够具体,它可以使社区受益。我的一些考虑是特定于我的,但我认为这个问题对任何面临决定 SQL 还是 NoSQL 还是两者的人都有用。
我们正在构建的 Web 应用程序包含本质上具有明显关系的数据以及面向文档的数据。我们想吃蛋糕,也想吃。
TL;DR:我认为下面的 #5 通过了气味测试。你?有没有人有将 SQL 和 NOSQL 集成到单个应用程序中的经验?我试图在下面列出解决此类问题的所有可能方法。我错过了一个有前途的替代方案吗?
从本质上讲,它是关系数据(您的典型 Web 应用程序内容,如用户、组等,以及我们需要能够实时对复杂查询进行切片和切块的文档元数据)和文档数据(例如我们没有兴趣加入或查询的数百个字段 - 我们对数据的唯一用例将是显示输入的单个文档)。
我想对我的首选方法进行完整性检查(如果你检查我的发帖历史,我非常明确地说明我不是 DBA),并列举我遇到的所有选项供其他人解决涉及关系和非关系数据的广泛相似的问题。
1. 每个文档类一张表
每个文档类都有自己的表,其中包含所有元数据和数据的列。
好处:
缺点:
2.EAV建模
只有一个字段表。实体-属性-值建模已经很好理解了。为了完整起见,我已将其包括在内。我认为 2013 年启动的任何新项目都不会有意采用 EAV 方法。
好处:
缺点:
3. 使用 PostgreSQL hstore 或 json 字段
这些字段类型中的任何一种都可以在关系数据库的上下文中存储无模式数据。我没有立即跳到这个解决方案的唯一原因是它相对较新(在 8.4 版中引入,所以不是那么新),我之前对它的接触为零,我很怀疑。这让我觉得是错误的,原因与我将所有漂亮的、易于规范化的数据扔进 Mongo 时感到不安的原因完全相同——即使 Mongo 可以处理文档之间的引用。
好处:
缺点:
4. 完全面向文档
把所有的东西都记录下来(在 MongoDB 的意义上)。创建一个类型的集合Document并称之为一天。将所有外围数据(包括有关用户帐户、组等的数据)也带入 mongo。这个解决方案显然比 EAV 建模更好,但我感觉不对,原因与 #3 感觉不对 - 他们都觉得把你的锤子也当作螺丝刀。
好处:
Document然后就收工了。缺点:
5. PostgreSQL 和 MongoDB
关系数据进入关系数据库,文档数据进入面向文档的数据库。在documents关系数据库表包含了所有我们可能需要索引或切片和切块上,当我们需要查询的文件中的字段的实际值,我们将利用这些数据,以及一个MongoDB中的ObjectId的。我们将无法使用 ORM 或内置管理员来处理文档本身的值,但这并不是什么大损失,因为整个应用程序基本上是文档的管理界面,我们可能不得不这样做将 ORM 的特定部分定制到不可接受的程度,使其按照我们需要的方式工作。
好处:
documents无论创建多少不同类别的文档,都只需要一张表。缺点:
Chr*_*ers 14
一些想法……
通常人们不想在不同的系统中存储紧密相关的信息片段。事情不同步的可能性很大,现在你手上的问题不是一个,而是两个。你可以用 Mongo 做的一件事是使用它来输入或输出数据。我的偏好是尽可能将所有内容保留在 PostgreSQL 中。但是,我要指出,这样做确实需要 PostgreSQL 编程的专业知识,而不适合不愿意致力于使用高级功能的商店。我看到的选项集与您略有不同。由于我的偏好不是我看到的列表,因此我将其提供给您。
您可能可以将元数据分成公共数据、类所需的数据和文档数据。在这方面,您将拥有一个包含基本公共信息的通用目录表,以及每个类一个表。在此表中,您将有一个 hstore、json 或 xml 字段,这些字段将存储其余数据以及存储必须受到显着约束的数据的列。这将减少您需要在每个类的这些表中放入的内容,但允许您随意利用约束。这三个选项有不同的问题,值得分别考虑:
hstore相对有限,但也被很多人使用。它不是非常新,但它只是一个键/值存储,并且不能嵌套数据结构,与 json 和 xml 不同。
json是很新的,现在并没有做很多事情。这并不意味着你不能用它做很多事情,但你不会开箱即用。如果你这样做,你可以期望做大量的编程,可能在 plv8js 中,或者,如果你想坚持使用旧环境,plperlu 或 plpython。 json在 9.3 中得到了更好的支持,但至少在当前的开发快照中是这样,所以当该版本发布时,事情会变得更好。
xml是三者中支持最好的,功能最多,支持历史最长。再说一遍,它是XML.....
但是,如果您决定将 Mongo 和 PostgreSQL 一起使用,请注意 PostgreSQL 支持 2 阶段提交,这意味着您可以运行写入操作,然后发出PREPARE TRANSACTION,如果成功,则在 Mongo 中进行原子写入。如果成功,则可以COMMIT在 PostgreSQL 中。
| 归档时间: |
|
| 查看次数: |
17494 次 |
| 最近记录: |