Почему СУБД не поддерживает типы массивов для столбцов? - PullRequest
5 голосов
/ 06 мая 2011

Давайте возьмем избитый до смерти пример движка блога.

У вас есть блог, в блоге есть сообщения, в сообщениях есть теги для организационных целей.После того, как мы решили, что проблема с тегами не является тривиальной в среде СУБД, мы отправляемся в Google для получения рекомендаций и в качестве первого попадания находим следующее краткое изложение решений: проектирует и связанные тесты .Тем не менее, все они идут за счет производительности или сложности.Похоже, что NoSQL-подобный подход, позволяющий хранить список тегов в столбце (в NoSQL мы можем хранить документы в документах), решит проблему хорошо.Почему бы не SQLServer / Qracle / MySQL / Postgres / и т. Д.тогда?

Сначала я подумал, что это может быть из-за разного размера.Но любая СУБД, на которую стоит обратить внимание, допускает некоторую форму varchar и текста (существенного размера).Таким образом, размер столбца (и тот факт, что один и тот же столбец в разных строках будет иметь разный размер, не проблема).Таким образом, вместо хранения большого количества текста, давайте сохраним список элементов одного типа (массив в большинстве языков) в столбце.Позвольте нам индексировать его для эффективного точного поиска совпадений.И, по крайней мере, для всех случаев использования, в которых я нуждаюсь в NoSQL DB, необходимость исчезнет как необходимость (я знаю, что многие люди недовольны масштабируемостью, но я не знаю / не беспокоюсь об этом, у меня нет масштабируемостивопрос, у меня есть ночные кошмары).Мы получаем упрощенный дизайн нашей схемы (такой же простой и понятный, как документ в документе NoSQL) и отличную производительность благодаря эффективной индексации.Еще страннее, что в БД с открытым исходным кодом (например, Postgres) нет какого-то патча для этой функции.В наши дни разработчики, имеющие мотивацию в этой области, похоже, в восторге от создания новых БД с нуля.

Я упускаю какие-то ошеломляющие технические препятствия или вышеупомянутые поставщики СУБД просто ленивы или ушли в прошлое?

Ответы [ 4 ]

2 голосов
/ 06 мая 2011

Причины исторические.

Разрешение значений любого типа «коллекции» внутри ячейки в таблице, как правило, считалось нарушением 1NF, поскольку подразумевало, «по определению», возможность появления «повторяющихся групп» внутри ) таблица.

Однако теория начала развиваться с первых дней существования SQL, и в настоящее время теория имеет следующее:

(a) В ячейке должно быть разрешено любое значение, включая типы Array / Set / Collection. (б) Быть в 1NF просто означает быть реляционными данными. (Но обратите внимание, что таблицы SQL обычно являются НЕ «реляционными» данными в том смысле, как теория определяет концепцию.)

Дата написала десятки страниц на эту тему. Прочитав их, вы получите ответ на свой вопрос, который будет гораздо более полным, чем любой ответ, который может здесь уместиться.

2 голосов
/ 06 мая 2011

Почему бы не SQLServer / Qracle / MySQL / Postgres / и т. Д.

Нет?

2 голосов
/ 06 мая 2011

Краткий ответ: потому что это было бы нереляционным. Большинство баз данных NoSQL избегают таких отношений, которые составляют традиционную реляционную базу данных.

Эта «задача» («хранение массива») может быть выполнена разными способами - XML, JSON, пользовательский формат или даже пользовательские типы баз данных и т. Д. Объем поддержки (включая поддержку нативных типов, как указал mabn) из) зависит от РСУБД. Например, SQL Server обеспечивает достаточную поддержку XML. Однако, как правило, это нарушает нормализацию базы данных (если об этом заботятся) - в случае NoSQL baseline часто таковым является.

Тест также действительно учитывает пересечение относительно большого количества тегов в запросе и не показывает никаких решений NoSQL для этой проблемы - например, Как бы решения NoSQL могли найти результаты запроса для n-тегов пересечения, хранящихся в массиве?

То есть, представьте, что используется тип массива . Сколько времени потребуется для выполнения тех же запросов? Без обширного использования индексов и хеш-соединений я представляю себе «очень долгое время».

Счастливое мышление.

1 голос
/ 06 мая 2011

Вы можете хранить таблицу внутри пересечения столбца и строки. Вы можете делать все, что вы могли бы делать с массивами в столбцах, и многое другое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...