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