Как лучше всего хранить произвольно сложную структуру данных в реляционной БД? - PullRequest
0 голосов
/ 25 февраля 2019

Кажется, что это должно быть решенной проблемой, но я не могу найти подходящий шаблон / руководство.

Я пытаюсь переместить наши настройки из файла конфигурации в базу данных.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...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...