我刚从大学毕业,所以对关系数据库的熟悉程度大部分来自于我的数据库课程,在该课程中,BCNF或3NF以外的任何事物都是荒唐的。当然,这是极端的目的,但是我的工作团队似乎确实将其推向了另一端。
在我们的微服务数据库架构中,实体很少有多个表。您通常会标准化到另一个表的所有内容都存储在json列中。如果以后发现需要查询此json中的属性之一,则会添加一个新列,并将数据存储在两个位置(是的,在同一表的两个不同列中)。
在许多情况下,这些json列绝对具有优势。如果您不需要查询数据,也不必单方面更改数据(这显然是您无法预测的),那么这不是一个坏主意。再加上我们的许多服务都看不到服务器,或者托管在具有淫秽磁盘空间的计算机上,无法满足他们的需求,因此数据复制不是一个大问题。(尽管我通常会出于哲学目的避免这种情况)
当前,我们正在构建一个服务,该服务根据规则所拥有的一组条件匹配规则,然后在规则为真(例如,所有条件都为真)时执行与这些规则关联的一组操作。我的最直接构建此服务的小组认为,从架构规则中规范动作和条件有很大的好处。显然,这些表与规则ID保持外键关系。从我们的角度来看,我们可以避免条件上的数据重复,这使我们能够确保仅对它们进行一次评估,并且在需要它们时很容易找到我们需要的条件和规则,而无需提取每个规则并在内存中进行搜索。
今天,他与我们的一位首席工程师交谈,试图使我远离这种模式。试图以各种方式争辩我们实际上并不需要它,这将在将来引起性能问题,并引用了我们拥有的旧单片,这是设计上的麻烦。他将我们正在做的事情称为“旧方法”,将带有json的平面表称为“新方法”。他争辩说,在我想要原子性的地方,我们不需要它,而不是查询,我们应该在内存中做更多的事情。这是我们许多服务现在遵循的设计原则。我们预计数据量不会大幅增长,这将使我们的查询保持快速。我们确实期望在规则评估和执行操作上花费大量时间。
我知道非关系数据库近年来已经变得越来越流行,但是即使在积极地搜索有关外键关系对性能的影响的信息时,我也看不到很多信息可以证明他的观点。我想他们可能会倾向于引入可能导致问题的大型事务,但这似乎是一个独立于外键本身的问题。
这是我的天真吗?还是我和我的子团队确实缺少某些东西?我没有明确提供有关我们问题的详细信息,因为我不一定正在寻找解决方案。考虑到这是我们大型团队的共同趋势,我真的很好奇他们是否对此有所帮助。