Кажется, это не проблема закона деметры, а проблема проектирования базы данных и целостности данных. Первый вариант следует исключить, поскольку он создает базу данных, которая определенно нарушает третью нормальную форму (3NF):
В вашем первом примере, если в городах страны HM, что произойдет, если, скажем, вы обновите этот город, чтобы он принадлежал другому региону, который больше не принадлежит стране? -> Бам! Целостность данных ушла! Конечно, маловероятно, что город переедет в другую страну , но, как вы сказали, это надуманный пример, и я говорю об общем случае
Для получения дополнительной информации вы должны воспользоваться Google Normalization и Third Normal Form.
Кроме того, в этом случае вы нарушаете 3NF только потому, что думаете, , что вы можете «повысить производительность», делая это. Это случай предварительной оптимизации и плохая практика. Хотя в некоторых случаях ненормализация является управляемым риском, вот, пожалуйста, драконы, и если вы только запускаете приложение в рельсах, это определенно не тот случай. Позвольте вашей БД беспокоиться о получении данных быстро. Вы можете помочь, предоставив хорошие индексы.
Кроме того, я думаю, что то, что вы ищете, - это способ создания вложенных отношений со многими. Вы хотите, чтобы это было так:
Страна HM Графства ЧЕРЕЗ Регионы
и то,
Страна HM Города ЧЕРЕЗ Графства
это будет стандарт в 3.1, если вы используете 3.0, тогда вы можете использовать
https://github.com/ianwhite/nested_has_many_through
самоцвет, которым я сейчас пользуюсь, и я вполне доволен.