Я думаю о создании веб-приложения для управления данными с открытым исходным кодом для различных типов данных.
Привилегированный пользователь должен иметь возможность
- добавить новые типы сущностей (например, "пользователь" или "семейство" )
- добавить новые свойства к типам сущностей (например, 'gender' to 'user')
- удалить/изменить объекты и свойства
Это будут обычные задачи для привилегированного пользователя. Он сделает это через веб-интерфейс приложения. В конце концов, все данные должны быть доступны для поиска и сортировки всеми типами пользователей приложения. Меня беспокоят два вопроса:
a) Как данные должны храниться в базе данных? Должен ли я динамически добавлять/удалять таблицы базы данных и/или столбцы во время выполнения?
Я не эксперт по базам данных. Я застрял в воображении, что с точки зрения реляционных баз данных приложение должно иметь возможность динамически добавлять/удалять таблицы (сущности) и/или столбцы (свойства) во время выполнения. И мне не нравится эта идея. Аналогично, я думаю, следует ли обрабатывать такие динамические данные в базе данных NoSQL.
Во всяком случае, я считаю, что такая проблема имеет разумное каноническое решение, о котором я пока не нашел и не думаю. Каков наилучший подход для такого управления динамическими данными?
b) Как реализовать это в Python с использованием ORM или NoSQL?
Если вы рекомендуете использовать реляционную модель базы данных, я бы хотел использовать SQLAlchemy. Однако я не вижу, как динамически создавать таблицы/столбцы с ORM во время выполнения. Это одна из причин, почему я надеюсь, что существует гораздо лучший подход, чем создание таблиц и столбцов во время выполнения. Является ли рекомендуемая модель базы данных эффективной с помощью SQLAlchemy?
Если вы рекомендуете использовать базу данных NoSQL, какой? Мне нравится использовать Redis - можете ли вы представить эффективную реализацию на основе Redis?
Спасибо за ваши предложения!
Изменить в ответ на некоторые комментарии:
Идея состоит в том, что все экземпляры ( "строки" ) определенного объекта ( "таблица" ) имеют один и тот же набор свойств/атрибутов ( "столбцы" ). Тем не менее, это будет совершенно корректно, если некоторые экземпляры имеют пустые значения для определенных свойств/атрибутов.
В основном пользователи будут искать данные через простую форму на веб-сайте. Они запрашивают, например. все экземпляры объекта E с свойством P, имеющим значение V выше T. Результат может быть отсортирован по значению любого свойства.
Наборы данных не станут слишком большими. Следовательно, я думаю, что даже самый глупый подход все равно приведет к созданию рабочей системы. Тем не менее, я энтузиаст, и я бы хотел применить современные и соответствующие технологии, а также хотел бы знать о теоретических узких местах. Я хочу использовать этот проект, чтобы собрать опыт разработки "Pythonic", современного, масштабируемого и надежного веб-приложения.
Я вижу, что первые комментарии, как правило, рекомендуют подход NoSQL. Хотя мне действительно нравится Redis, похоже, было бы глупо не использовать модель документа/коллекции Mongo/Couch. Я искал mongodb и mongoengine для Python. Поступая таким образом, я делаю шаги в правильном направлении?
Изменить 2 в ответ на некоторые ответы/комментарии:
В большинстве ваших ответов я пришел к выводу, что динамическое создание/удаление таблиц и столбцов в реляционном изображении не. Это уже ценная информация. Кроме того, существует мнение, что вся идея динамической модификации объектов и свойств может быть плохим дизайном.
Как именно этот динамический характер должен быть основной целью/особенностью приложения, я не отказываюсь от этого. С теоретической точки зрения я согласен с тем, что выполнение операций в динамической модели данных должно быть медленнее, чем выполнение операций в статической модели данных. Это совершенно нормально.
Выраженный абстрактным способом, приложение должно управлять
- расположение данных, то есть "динамический список" допустимых типов сущностей и "динамический список" свойств для каждого допустимого типа сущности
- сами данные
Я ищу интеллектуальный и эффективный способ реализовать это. Из ваших ответов, похоже, что NoSQL - это путь, который является еще одним важным заключением.