Какую базу данных следует использовать в приложении, где мои модели представляют не разные идеи, а разные типы с перекрывающимися полями?

Я создаю приложение, в котором буду собирать статистику из игры. По сути, я буду парсить логи, где каждая строка — это игровое событие. Существует около 50 различных видов событий, но многие из них связаны между собой. Каждое событие имеет определенный набор значений, связанных с ним, и связанные события имеют много общих атрибутов. Всего существует около 50 атрибутов, но любое событие имеет только около 5-10 атрибутов.

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

Учитывая реляционную базу данных, я подумал о следующем:

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

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

  3. Сгруппируйте связанные события вместе, сводя к минимуму как количество таблиц, так и количество атрибутов в каждой таблице. Тогда проблема становится группировкой. Это далеко не однозначно, и может потребоваться много времени, чтобы правильно установить супертипы событий. Кроме того, это не полностью решает проблему наличия достаточного количества нулей.

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

Есть идеи?


person WhatAWorld    schedule 02.06.2012    source источник
comment
Создайте свою базу данных, чтобы свести к минимуму время вычислений для получения интересующих вас типов запросов. Добавление записей обычно намного дешевле, чем запросы.   -  person starbolin    schedule 02.06.2012
comment
Возможно, список хешированных номеров транзакций под каждым «атрибутом». Таким образом, вы легко получите количество транзакций для каждого доступного атрибута, а также сможете вернуться к отдельным транзакциям, если захотите.   -  person starbolin    schedule 02.06.2012
comment
Карта или график, в отличие от основанных на записях, минимизируют требования к хранению пустых полей.   -  person starbolin    schedule 02.06.2012


Ответы (1)


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

Типы запросов, которые вы будете делать с этими данными, очень важны для наилучшего дизайна схемы, но представьте, что ваши документы (в одной коллекции, аналогичной 1. выше) выглядят примерно так:

{  "round" : 1,
   "eventType": "et1",
   "attributeName": "attributeValue",
   ...
}

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

Вам не нужно заранее знать, сколько атрибутов у вас может быть, какие из них относятся к каким типам событий или даже сколько типов событий у вас есть. Когда вы создадите свой прототип/приложение, вы сможете развивать свою модель по мере необходимости.

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

Я бы посоветовал вам попробовать его и посмотреть, подходит ли он вам. Я собирался добавить несколько ссылок, чтобы помочь вам начать работу, но их слишком много, чтобы выбрать из них! Поскольку у вас может возникнуть вопрос о том, использовать ли средство сопоставления объектов или нет, вот хороший ответ.

Хорошим описанием работы с динамическими атрибутами в Ruby и MongoDB является здесь.

person Asya Kamsky    schedule 02.06.2012
comment
Спасибо за ваш вклад. Возникает вопрос: как выглядят мои документы? Будет ли у меня около 50 или около того разных моделей, что приведет к такому количеству разных документов, или есть способ упростить структуру? - person WhatAWorld; 02.06.2012
comment
Было бы полезно, если бы вы могли расширить и уточнить, в какой форме вы хотите отображать свои данные. Я не получаю четкого представления от вашего поста, и кажется, что, возможно, вы сами этого не понимаете. - person starbolin; 02.06.2012
comment
Все ваши документы выглядят так же, как в примере, который я привел, только наборы attributeName будут разными для разных типов событий. Ваш комментарий о разных моделях, похоже, все еще находится в реляционной области с фиксированной схемой. Что хорошо в базах данных документов, так это гибкость схемы. - person Asya Kamsky; 02.06.2012
comment
@starbolin - мне нужно будет показать данные в виде графика, что включает в себя извлечение всех видов данных о событиях. - person WhatAWorld; 02.06.2012
comment
@AsyaKamsky - я понимаю, как я могу динамически запрашивать MongoDB, но как насчет самих моделей Rails? Разве им не нужно, чтобы каждое поле было предварительно определено в классе Event? - person WhatAWorld; 02.06.2012
comment
Смотрите последнюю ссылку в моем ответе. Вам не нужно использовать картограф/фреймворк. Но если вы это сделаете, это очень распространенный вопрос - сохранение либо пар ключ-значение атрибута, либо массивов вложенных документов, представляющих атрибуты, где имя хранится вместе со значением {attrname:name,attrvalue:value} и есть другие способы. У разных картографов здесь несколько разные подходы. Вот хорошая ссылка, в которой рассказывается о динамических атрибутах paul -wong-jr.blogspot.com/2012/03/ - person Asya Kamsky; 02.06.2012
comment
Эта ссылка абсолютно идеальна, спасибо. Я определенно использую MondoDB. Принятый. - person WhatAWorld; 02.06.2012
comment
Я поместил эту ссылку в ответ - согласен, это продуманная статья с хорошим примером кода. - person Asya Kamsky; 02.06.2012
comment
Мбадов пишет: ...показать данные в виде графика,... График чего именно? Суммы, подсчеты, средние значения и т. д.? И я предполагаю, что вы имеете в виду диаграмму, как в Excel. Не логические графики, как в теории игр? О каком большом наборе данных мы говорим? Я не вижу беспокойства по поводу нулей, особенно если это не плоская база данных. - person starbolin; 02.06.2012
comment
Графики сумм и средних, да. Набор данных легко будет состоять из нескольких миллионов строк. Я думаю, что MongoDB лучше соответствует моим потребностям, чем реляционная база данных. - person WhatAWorld; 02.06.2012