Почему многозначное поле плохая идея в реляционных базах данных - PullRequest
4 голосов
/ 27 ноября 2011

Работая с Mongodb и Solr / Lucene, я начинаю задумываться, почему многозначные поля для реляционных баз данных (как правило) считаются плохой идеей?

Мне известны теоретические основы реляционной базы данных и нормализация . На практике, однако, я столкнулся со многими случаями использования, когда я заканчиваю тем, что использую мета-таблицу пар ключ-значение для дополнения основной таблицы, например, в случае тегирования, когда мне не нужно делать несколько объединений искать данные. Или когда требования внезапно изменились с необходимости поддержки одного автора для нескольких авторов на статью.

Итак, каковы некоторые недостатки наличия многозначных полей или поставщик решил не поддерживать его, поскольку он не является частью стандарта SQL?

Ответы [ 3 ]

5 голосов
/ 28 ноября 2011

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

Предположим, у вас есть Студенты и Курсы, и вы смоделируете все это так, чтобы вы могли сказать в одной строке в одной таблице: «Джон Доу берет {французский, алгебра, теория отношений}» и «Джейн Доу { Немецкий язык, функциональные вычисления, теория отношений} ".

Это позволяет легко задавать вопросы «за какими курсами следуют ...», но попытайтесь представить, что потребуется, чтобы получить ответ на вопрос «что представляют собой все студенты, которые следуют реляционной теории».

Постарайтесь представить, что должна делать сама система, чтобы дать такой запрос (если это было возможно написать) хоть какой-то шанс выполнить разумно ...

2 голосов
/ 31 декабря 2012

Смещение запроса предполагает, что SQL всегда является хорошим языком запросов. Дело в том, что это иногда отличный язык запросов, но он никогда не подходил всем. Многозначные базы данных позволяют упаковать несколько значений и обрабатывать запросы «альтернативной перспективы». Примеры MVDB: UniData http://u2.rocketsoftware.com/products/u2-unidata, OpenInsight http://www.revelation.com/, Реальность http://www.northgate -is.com / . Есть много других. Их языки запросов поддерживают то, что вы хотите сделать.

1 голос
/ 27 ноября 2011

Я думаю, что это коренится в том факте, что не существует простого, стандартного способа сопоставить коллекцию с колонкой в ​​реляционном мире.Значение мультиполя - это, по сути, простая коллекция (массив из строк в большинстве случаев использования), который трудно представить в виде столбца .Некоторые СУБД поддерживают это с помощью разделителя, но, опять же, он начинает ощущаться как анти-шаблон, даже если драйвер БД позволяет использовать многозначные поля в реляционной базе данных.Такие базы данных, как MongoDB, используют JSON-подобную структуру для определения данных, в которых коллекции легко отображаются и извлекаются.

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