如何最好地在关系数据库中存储任意复杂的数据结构?

时间:2019-02-25 02:03:55

标签: sql database-design orm

看来这一定是一个已解决的问题,但我找不到合适的模式/指南。

我正在尝试将我们的设置从配置文件移动到数据库。 API将充当网守,因此在最坏的情况下,我可以将json blob转储到数据库中,然后依靠API来管理所有内容。

这种方法让人感觉很肮脏,并且有一个缺点,那就是我需要从SQL中更新设置时,要么编写复杂的查询来解析Jsopn,要么手工完成。

因此,我希望能够使用适当的数据类型和规范化的架构将设置存储在数据库中。

由于我需要存储多个服务使用的设置,因此我无法对结构和复杂性做出任何假设-想想XML配置文件。

我不需要了解上下文,但是我确实需要能够完美地保存/检索结构(并可能输出多种格式(json / xml / yml / etc))

作为我可能需要坚持的一个例子:

{
  "Servers": ["a", "b", "c"],
  "Port": 1234,
  "RetryOnFail": true,
  "Plugins": [
    {
      "Name": "Plugin1",
      "Filters": {
        "a": [51, 42, 22],
        "b": ["chomp", false, 12]
      }
    }
  ]
}

理想情况下,我希望能够处理不能保证后续子项匹配相同结构的情况,例如{"children": {"a": 1}, {"b": false}, [12, 11]},但如果那是一座桥梁,我可以没有它。 >

对于实际值是存储在一个宽表(每种数据类型的字段)还是一系列小表(每种数据类型一个)中,我没有强烈的偏好,但是无论哪种情况,我都需要一个或两个表描述设置的结构。

因此...在数据库中存储此架构的正确方法是什么?我知道我需要跟踪数据类型等。如果这只是一棵简单的树,我会将每个设置都指向其父级。我仍然可以这样做,但似乎我需要上下文的其他信息-IsDictionary,IsList等...

我看不到一种优雅的,标准化的方式来做到这一点(避开实际为每个元素实时生成表的过程,但是对于这样一个简单的问题,它似乎设计得过分,并带有安全性或多方面的考虑数据库的复杂性。

这是我开始的路线,但感觉就像是死路一条

class settings(models.Model):
    class Meta:
        db_table = "settings"
    Component = models.CharField(max_length=64)
    IsSensitive = models.BooleanField(null=False, default=False)
    IsLocked = models.BooleanField(null=False, default=True)
    Key = models.CharField(max_length=256)
    Type = models.CharField(max_length=6)
    Root = models.ForeignKey('self', null=True, related_name='Descendents')
    Parent = models.ForeignKey('self', null=True, related_name='Children')


class settings_date(models.Model):
    class Meta:
        db_table = "settings_date"
    Setting = models.ForeignKey(settings, null=False, related_name='AsDate')
    Key = models.CharField(max_length=256)
    Value = models.DateTimeField(null=False)

# etc...

0 个答案:

没有答案