Я готов дать MongoDB и CouchDB серьезную попытку. До сих пор я работал немного с монго, но я также заинтригован УСПОКОИТЕЛЬНЫМ подходом Дивана.
Работая в течение многих лет с реляционным DBS, я все еще не получаю то, что является лучшим способом добраться, некоторые вещи покончили не реляционные базы данных.
Например, если у меня есть 1 000 автомастерских и 1 000 автомобильных типов, я хочу указать, какие автомобили каждый магазин продает. Каждый автомобиль имеет 100 функций. В реляционной базе данных я сделал бы среднюю таблицу для соединения каждой автомастерской с автомобильными типами, которые она продает с помощью идентификаторов. Каков подход Нет? Если каждая автомастерская продает 50 автомобильных типов, это означает копировать огромный объем данных, если я должен сохранить в автомастерской все функции всех автомобильных типов, это продает!
Любая справка ценится.
Корпорация Майкрософт опубликовала документ по этому вопросу. Я его не читал.
-121--4690675-Украл код из этого вопроса и ищет ответ HitScan.
CGImageRef imageRef = CGImageCreateWithImageInRect([largeImage CGImage], cropRect);
// or use the UIImage wherever you like
[UIImageView setImage:[UIImage imageWithCGImage:imageRef]];
CGImageRelease(imageRef);
-121--4648349- В MongoDB часто используемым подходом было бы хранение списка _ids типов автомобилей в каждой автомастерской. Таким образом, нет отдельной таблицы соединений, но по-прежнему в основном делает соединение на стороне клиента.
Внедренные документы становятся более актуальными для таких случаев, как «не многие ко многим».
С точки зрения HBase/BigTable, обычно вы полностью денормализуете данные и используете поле "список" или столбец многомерной карты (см. эту ссылку для лучшего описания).
Слово "колонка" - это еще одно нагруженное как "таблица" и "база", которое несет в себе эмоциональный багаж многолетнего опыта работы с РСУБД.
Вместо этого, я нахожу, что легче думать об этом как о многомерной карте - Карта карт, если хотите.
В вашем примере для отношений "многие-ко-многим" вы можете создать две таблицы и использовать столбец многомерной карты для хранения отношений между таблицами.
См. вопрос 20 в FAQ по Hadoop/HBase FAQ:
Q:[Michael Dagaev] How would you спроектировать таблицу Hbase для много-ко-многим ассоциации между двумя сущностями, например например, студент и курс?
Я бы определить две таблицы: Студент: студент данные студента (имя, адрес, ...) курсы (используйте идентификаторы курсов в качестве столбцов Курс: идентификатор курса данные курса (название, учебный план, ...) студенты (используйте идентификаторы студентов в качестве имеет ли это смысл?
A[Джонатан Грей]: Ваша схема действительно имеет смысл. Как вы сказали, вы вероятно, будет два семейства столбцов в в каждой из таблиц "Студент" и "Курс". Одно для данных, другое с столбцом для каждого студента или курса. Для например, строка студента может выглядеть например: Студент : id/row/key = 1001 data:name = Имя студента data:address = 123 ABC St courses:2001 = (Если вам нужна дополнительная информация об этом ассоциации, например, если они в списке ожидания) курсы:2002 = ... Эта схема дает вам быстрый доступ к запросам, показывающим все занятия для студента (таблица "студент", "курсы семейство), или все студенты для класса (таблица "Курсы", семейство "Студенты").
Я могу разговаривать только с CouchDB.
Лучший способ сохранить данные в базе данных - это вообще не нормализовать их, кроме преобразования в JSON. Если эти данные - "автомобили", то вставьте все данные о каждой машине в базу данных.
Затем вы используете map / reduce для создания нормализованного индекса данных. Итак, если вам нужен индекс каждой машины, сначала отсортированный по магазинам, а затем по типу машины, вы должны указать каждой машине индекс [магазин, тип машины].
Сокращение карты поначалу кажется немного пугающим, но вам не нужно разбираться во всех сложных вещах или даже деревьях, все, что вам нужно понять, это как работает сортировка ключей.
http://wiki.apache.org/couchdb/View_collation
Только с этим вы можете создавать удивительные нормализованные индексы по разным документам с помощью системы сокращения карты в CouchDB.