2012-03-26 2 views
1

У меня есть модель города, и каждый город имеет боевые единицы, указанные в модели CombatUnit. Я изначально создаю много ассоциаций city_combat_units, но я не уверен, действительно ли это лучший способ.Сериализовать или использовать отдельную модель?

Поскольку существует 10 различных типов боевых единиц, есть много дублирования, как:

(city_id, combat_unit_id, number) => (1,1,10) 
(city_id, combat_unit_id, number) => (1,2,4) 
(city_id, combat_unit_id, number) => (1,3,9) 

Вы получаете идею. Итак, мне интересно. Может ли быть лучше сделать так, чтобы у Города был один файл battle_units_list, где атрибут list - это просто сериализованный хеш, который содержит имена и номера единиц?

Было бы неплохо? Будет ли это универсальным?

ответ

1

Обычно я предлагаю вам придерживаться вашей нынешней модели, что позволяет упростить манипулирование отношениями между вашим городом и вашими боевыми подразделениями. Да, у вас будет небольшое дублирование идентификаторов, но это намного чище, чем сериализованный список, как вы предложили.

Я также могу представить некоторые сценарии, в которых отношение, сопоставленное в таблице, могло бы помочь, например, если вам нужно знать, сколько городов имеет 10 боевых единиц типа 2, отвечая на этот вопрос с вашей текущей настройкой, это довольно прямо вперед, другое решение подразумевает разбор списка для каждого города, а затем поиск подходящего алгоритма для ответа на вопрос.

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

Итак, если у вас есть действительно нужна опция сериализации для какой-то странной оптимизации, я бы посоветовал придерживаться вашей таблицы.

1

Сериализованные атрибуты могут быть быстрее для извлечения, но они намного медленнее меняются. Добавление записи в большой список потребует повторной записи всего списка с добавлением новой записи. Они также страдают от условий гонки, когда одно обновление может быть переписано другим. Модель соединения - это всегда самый надежный способ сделать это.

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

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