【发布时间】:2018-09-05 20:40:35
【问题描述】:
我有一个名为Campaign 的抽象实体和一些最终实体,如FooCampaign、BarCampaign 等。这套是开放式的。所有最终实体都具有抽象实体中描述的公共字段。公共字段会随着时间的推移而变化,但不会经常发生变化——我可能想添加更多共享字段或删除其中一些。最终实体的字段也是如此。我想知道为此设计的数据库,这些是我正在考虑的选项:
- 关系型数据库,一个表用于公共字段,一个表用于每个最终实体,它们之间是一对一的关系。
- 关系型数据库,只有一个表,最终实体的任何唯一字段都保存在 JSON 列中。
- NoSQL 数据库。
我的应用程序是用 PHP (Symfony 4) 编写的,所以我热衷于使用 Doctrine。我倾向于下意识地使用选项#2,但真的不知道这些选项中的任何一个的利弊。我需要能够根据唯一字段查询活动,速度也很重要。
哪些选项更适合我的情况,还有其他选择吗?
更新
Doctrine inheritance mapping,在第一条评论中提到,似乎非常适合我的情况。但是,当没有像 Mongo 这样的用于无模式数据的 nosql 数据库时,为什么还要为此烦恼(尽管我的数据并不完全是无模式的)?所以问题是 RDBMS 与继承映射 VS NoSQL。
【问题讨论】:
-
您的用例似乎非常适合inheritance mapping。您仍然可以选择一张桌子或多张桌子。我过去通过单表映射解决了类似的问题(资产管理,其中资产可以是 PDF 或 JPEG 或 docx;共享某些数据,但每个数据也有唯一的数据),并且效果很好。然而,这可能取决于您的用例。
-
@k0pernikus Right 似乎非常合适。我现在只是对 RDBMS 与 NoSQL 有疑问。
-
最后,你不应该花太多时间来决定走哪条路。选择任何你觉得对你来说更舒服的解决方案。我认为这两种方法的所有缺点很可能不会影响你。 mysql 和 nosql 都足够好。我个人会偏向于单表继承。
标签: php database-design doctrine-orm orm nosql