抽象实体的数据库设计

时间:2018-03-27 12:28:55

标签: php database-design doctrine-orm orm nosql

我有一个名为Campaign的抽象实体和许多最终实体,例如FooCampaignBarCampaign等等。这套是开放式的。所有最终实体都具有抽象实体中描述的公共字段。公共字段可以随时间变化,但不是经常变化 - 我可能想要添加更多共享字段或删除其中一些字段。这与最终实体的领域相关。我想知道这个数据库设计,这些是我考虑的选项:

  1. 关系数据库,公共字段的一个表和每个最终实体的表,它们之间的一对一关系。
  2. 关系数据库,只有一个表,最终实体的任何唯一字段都保存在JSON列中。
  3. NoSQL数据库。
  4. 我的应用程序是用PHP(Symfony 4)编写的,所以我热衷于使用Doctrine。我倾向于在潜意识中使用#2选项,但实际上并未意识到这些选项的优缺点。我需要能够根据独特字段查询广告系列,速度也很重要。

    哪些选项更适合我的情况,还有其他选择吗?

    更新

    在第一条评论中提到的

    Doctrine inheritance mapping似乎完全适合我的情况。但是,当有像Mongo这样的nosql数据库用于无模式数据时,为什么还要烦恼呢(虽然我的数据不是完全无模式的)?所以问题是RDBMS与继承映射VS NoSQL。

1 个答案:

答案 0 :(得分:0)

当广告系列出现时,我假设或预测会有很多要求运行不同的查询来返回您拥有的数据的分析。为此,您需要更多的灵活性和能力来访问可以运行分析查询的广告系列的每个小记录。如果要在单个json列中序列化不同的字段,那么拥有json数据会限制很多。

我建议你是否愿意使用MySQL:

因此,如您所述,您拥有包含所有命令字段的广告系列表。对于动态字段,您可以使用第二个表格,如下所示:

id  campaign_id field_name  field_value
1   1   area    somearea
2   1   budget  100
3   2   area    anotherarea
4   2   owner   someowner
5   2   is_prime    TRUE

因此,campaign_id将是来自广告系列表的外键,field_name和field_value是您更改的动态字段。这样您就可以灵活地为广告系列实体添加任意数量的动态字段,从而消除了管理数据的担忧。

我个人喜欢像Mongo一样使用NoSQL,因为我不需要担心强大的关系。我可以尽可能灵活地获得广告系列数据。更不用说,Mongo有很好的聚合功能(MySQL也有:))所以没有任何限制。最后会是个人偏好。