Думаю, структура базы не должна быть какой-то особенной для решение данной задачи. Просто создаем таблицу, заливаем в нее данные (примеры на MS SQL, но думаю, суть будет ясна):
С помощью Python подключиться к базе не очень сложно, вот ссылка на статью, там довольно доступно объясняется -
https://habr.com/ru/post/321510/
После получения данных из базы, они будут выглядеть примерно так:
result = [('Moscow', 'Ivanova', '10',) , ('Moscow', 'Ivanova', '13a',) , ('Moscow', 'Ivanova', '2') ......]
После чего добавляем данные из базы в словарь, из которого потом формируем json с помощью модуля с таким же названием(json).
Вот скрипт, которым я пользовался (данные немного другие, чем со скриншота, но суть не меняется):
import json
import collections as col
rows_from_DB = [('Moscow','Lomonosova','14',), ('Moscow','Lomonosova','15a',), ('Omsk','Ivanova','4',), ('Moscow','Kotlyara','7',), ('Sochi','Zhukova','11b',)]
cities = col.defaultdict()
for row in rows_from_DB:
if row[0] not in cities:
cities[row[0]] = col.defaultdict()
if row[1] not in cities[row[0]]:
cities[row[0]][row[1]] = []
cities[row[0]][row[1]].append(row[2])
print(json.dumps(cities))
Скрипт далеко не идеальный, думаю, если почитать больше про defaultdict, будет проще его оптимизировать.
На выходе вот такой json (немного отличается от требуемого, но можно поиграться с модулем, для нужного результата):
{
"Omsk": {
"Ivanova": ["4"]
},
"Moscow": {
"Kotlyara": ["7"],
"Lomonosova": ["14", "15a"]
},
"Sochi": {
"Zhukova": ["11"]
}
}