代码之家  ›  专栏  ›  技术社区  ›  Basic

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

  •  0
  • Basic  · 技术社区  · 6 年前

    这似乎是一个必须解决的问题,但我找不到合适的模式/指南。

    我正在尝试将设置从配置文件移动到数据库。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 回复  |  直到 6 年前