Допустим, вы разрабатываете приложение, которое по требованию позволяет пользователю гибко создавать пользовательские типы (для управления своими данными, какими бы они ни были). Одним из способов решения этой проблемы является определение схемы, которая позволяет нам использовать метаданные для определения этих типов. Это часто означает, что полученная схема БД будет иметь некоторый способ хранения пар ключ / значение (свойства, принадлежащие экземпляру типа), где часть значения обычно хранится в виде строки (независимо от основного типа данных столбца). Это само по себе представляет ряд проблем. Я читал, что некоторые осуждают , используя db для отслеживания пар ключ / значение.
Основная проблема, с которой я столкнулся, заключается в том, как это влияет на запросы. Например, предположим, что пользователь хочет создать тип с именем Event
, имеющий следующие столбцы: event_name
, description
, start_at
и end_at
(datetime). Использование пар ключ / значение, где все значения являются строками, делает запросы более чувствительными к тому, как форматируются значения параметров; следовательно, запрос набора событий, попадающих между двумя датами, не так прост, как если бы мы использовали фактические столбцы datetime.
Это побуждает меня рассмотреть альтернативные проекты, которые бы приспособили нестандартные типы. Первое, что пришло на ум и которое мне понравилось больше всего, - это использовать саму базу данных для определения этих пользовательских типов. То есть вместо того, чтобы создавать отдельный набор мета-таблиц, в которых должны быть определены все типы, просто дайте пользователю ограниченную привилегию создавать / изменять свои собственные таблицы в базе данных (все из которых будут иметь префикс с его именем пользователя: например, usertable-johndoe-album
). Наиболее заметная проблема, с которой я сталкиваюсь при таком подходе, - это огромное количество таблиц, которые в конечном итоге могут существовать. Интересно, есть ли у большинства баз данных с открытым исходным кодом (MySQL, Postgres и т. Д.) Жесткое или практическое ограничение на количество таблиц, которыми они могут управлять, не создавая препятствий. То есть я знаю, что большинство готовых к работе баз данных настроены на обработку миллионов записей, но я не знаю, оснащены ли они для обработки сотен тысяч таблиц. Кто-нибудь знает?
Учитывая требование разрешить пользователям создавать свои собственные типы, вы предпочитаете пары ключ / значение или используете саму базу данных? Или, если у вас есть другая модель / идея, опишите ее.