Как моделировать данные с неизвестными атрибутами? - PullRequest
2 голосов
/ 28 января 2011

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

Например ... скажем, я хочу смоделировать информацию о странахмир .В каждой стране есть население , флаг и список языков , это достаточно просто.Но, скажем, мы также хотим смоделировать рекорд побед / поражений их национальной бейсбольной команды , и, конечно, не во всех странах есть такой.Или мы хотим отследить линию их королей и королев (опять же, очевидно, это не применимо к большинству стран).Или мы решаем, что хотим смоделировать число юрт, которое средний член клана возведет за всю жизнь .

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

Возможно, это хорошее применение для Ориентированной на документы базы данных (MongoDB?) Или, возможно, какой-то шаблон проектирования может бытьприменяется к классической реляционной базе данных?

Ответы [ 4 ]

7 голосов
/ 28 января 2011

Вы можете сделать это в чистой реляционной базе данных и наслаждаться скоростью и мощью реляционных баз данных.

Вам необходимо использовать Шестую Нормальную Форму, правильный метод с полной целостностью и контролем.

EAV - это подмножество 6NF без Целостности или контроля и обычно очень плохо реализовано.

Мои ответы на эти вопросы дают полное представление о предмете.Последнее особенно долго из-за контекста и аргументов.

EAV-6NF Ответ один
EAV-6NF Ответ два
EAV-6NF Ответ Три

4 голосов
/ 03 февраля 2011

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

2 голосов
/ 28 января 2011

Вы можете применить Модель значения атрибута сущности , но это PITA в рельсах;Я использовал MongoDB, и он отлично подходит для того, что вам нужно.

0 голосов
/ 28 января 2011

Если вы используете Rails, вы можете использовать serialize :column_name в своей модели, и она сохранит большинство объектов успешно для вас без какой-либо дополнительной работы.Если вы не думаете, что вам понадобится база данных NoSQL без схемы, возможно, это самая простая вещь, которую вы можете сделать, чтобы получить эту функциональность.

class Country << ActiveRecord::Base
  serialize :data

  def add_statistic(name, value)
    data[name] = value
  end

  def get_statistic(name)
    data[name]
  end
end

Эти методы несколько излишни;они там только для того, чтобы показать вам пример.

Самым большим недостатком этого типа системы является необходимость поиска или запроса на основе этих вещей.В конце концов, Rails не будет обрабатывать Country.find_by_win_loss_record_of_national_basketball_team для вас.

...