一对一相关表适用于分布式sql数据库吗



假设我有一个User表,以及与用户有一对一关系的其他表(例如,UserSettingsUserStatistics(。由于sql数据库不将复杂结构保存在表字段中(有些数据库允许具有未定义格式的JSON字段(,所以只添加所述表,允许为每个用户存储单独的(复杂的(数据可以吗?"加入"更多查询会使性能复杂化吗?

在分布式数据库的情况下,它是否会将这些(连接的(表随机保存在不同的节点中,从而使彼此之间产生更多的冗余请求并降低效率?

1:1联接肯定会增加开销,尤其是在分布式数据库中。使用JSON或其他无模式列是避免这种情况的一种方法,但也有其他方法。

最简单的方法是";宽表":不要创建一个包含a、b、c列的新表UserSettings,而是将setting_a、setting_b、setting_c列添加到User表中。使用ORM时,您仍然可以将它们视为单独的对象,只需要一些额外的代码。

一些数据库(比如你在问题中标记的CockroachDB(可以让你将一个宽表细分为";列族";。这往往会让你两全其美:数据库知道在同一节点上为同一用户存储行,但也允许它们独立更新。

使用JSON列的主要缺点是它们更难高效查询——如果你想让所有用户都有某个设置,或者只想知道一个用户的一个设置,那么如果数据库必须解析一个JSON列来解决这个问题,或者你必须提取整个blob并在你的应用程序中执行,你至少会受到轻微的性能影响。不过,如果出于其他原因更方便,您可以通过在JSON列上添加反向索引,或在您感兴趣的特定值上添加表达式索引来解决此问题。索引的成本可能与1:1联接类似,但您可以通过使用STORING关键字告诉DB将所有用户列的副本写入索引来减轻CockratchDB中的成本。

最新更新