我有一个称为 Campaign
的抽象实体,以及许多最终实体,例如 FooCampaign
, BarCampaign
等。这套是开放式的。所有最终实体都具有抽象实体中描述的公共字段。不过,常见字段可能会随着时间的推移而变化,但是我可能想添加更多共享字段或删除其中一些字段。与最终实体的字段相同。我想知道这是一个数据库设计,这些是我正在考虑的选择:
- 关系数据库,一个用于公共字段的表和每个最终实体的表,它们之间的一对一关系。
- 关系数据库,只有一个表,最终实体的任何唯一字段都保存在JSON列中。
- NOSQL数据库。
我的应用程序写在PHP(Symfony 4(中,因此我渴望使用学说。我倾向于在潜意识中使用选项2,但实际上并不了解这些选项中的任何一个。我需要能够根据唯一字段查询广告系列,速度也很重要。
哪种选择更适合我的情况,还有其他选择吗?
update
学说继承映射(在第一个评论中提到(似乎完全符合我的案子。但是,当有NOSQL数据库(如Mongo(的示意性数据(虽然我的数据并不完全是示意性(时,为什么还要打扰这一点呢?因此,问题是带有继承映射与nosql的rdbms。
当广告系列进入图片时,我假设或预测会有很多要求运行不同查询的数据,以返回您拥有的数据的分析。为此,您需要更高的灵活性和能够访问每个小记录的广告系列,您可以在其中运行分析查询。如果您将不同的字段序列化在单个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
因此,Apaime_id将是广告系列,field_name和field_value的外键,是更改的动态字段。这将使您灵活地为您的广告系列实体添加任意数量的Dynamica字段,从而消除了管理数据的担忧。
我个人会喜欢像Mongo这样的Nosql,只是因为我不必担心牢固的关系。我可以拥有尽可能多的灵活性来获得广告系列数据。更不用说,Mongo具有出色的聚合功能(MySQL也有:)(,因此没有任何限制。最终将是个人喜好。