2013-07-26 3 views
0

Я играю с лучшим способом моделирования документов mongodbMongoDB экземпляр против отношения denormalistion

Я моделирую школу.

Студент имеет много предметов.

Student{ 
    subjects:[ {name:'', 
       level:'', 
       short name:'' 
      }, 
      {...}, 
      {...}] 
} 

Решено отрицать и внедрять предметы в учащихся для выполнения.

Есть редкие случаи, когда субъект должен быть запрошен и обновлен.

subjects.all 
subject1.short_name = 'something new' 

Я знаю, что мне нужно будет проходить через каждого ученика, чтобы обновить каждый предмет reocrd.

Однако каков наилучший способ вернуть все уникальные предметы?

Можете ли вы сделать уникальный поиск имен учеников.subjects, например?

Или лучше иметь другую коллекцию, которая

Subjects{ 
    name:'', 
    level:'', 
    short name:'' 
} 

Я до сих пор держать denormalised Student.subject. Но это просто для запроса всех предлагаемых предметов.

Обновленный обновил бы это + каждый встроенный Student.subject?

Любые предложения/рекомендации?

+0

Вы не можете запросить все в денормализованной базе данных с большим мастерством. Ваша структура данных должна зависеть от того, какие вопросы важны для вас. Сначала создайте список всех запросов, которые вам нужны, и добавьте их здесь. Для отношений «многие ко многим» обычно требуется нормализованная структура, но вы можете дублировать данные в нескольких местах, чтобы упростить запрос. – Jayz

+0

@Jayz Дублирование данных - это проклятие программирования баз данных, вы определенно не захотите дублировать этот – Sammaye

+0

@Sammaye, согласитесь с вашим общим утверждением, но применимы только к реляционным dbs. Это неизбежно в некоторых случаях с нереляционными dbs, иначе некоторые запросы могут занять слишком много времени. – Jayz

ответ

0

Однако каков наилучший способ вернуть все уникальные предметы?

Это короткое падение вашей схемы здесь. Вы обменялись способностью делать такие вещи легко в обмен на другие преимущества скорости, которые вы делали бы чаще.

В настоящее время единственным реальным способом является либо использовать distinct() команду (http://docs.mongodb.org/manual/reference/method/db.collection.distinct/):

db.students.distinct('subjects.name'); 

или структуру агрегации:

db.students.aggregate([ 
    {$unwind:'$subjects'}, 
    {$group:{_id:'$subjects.name'}} 
]) 

Как и так.

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

Смежные вопросы