С вариантом B, с моей точки зрения, не все в порядке.Во-первых, ничто не мешает двум или более городам быть отмеченными в качестве столицы для определенного штата или страны.Вам необходимо добавить дополнительную проверку в ваши формы, чтобы убедиться, что этого не произошло.
С точки зрения запросов, я думаю, что А все еще предпочтительнее.Например, если вы хотите получить все города в штате, столицей которого является город X, в первом вы должны сделать:
cities = City.objects.filter(state__capital__name="City X")
, а во втором вам нужно будет сделать это:
cities = City.objects.filter(state=City.objects.get(name="City X"))
, который преобразуется в подзапрос, который, вероятно, будет менее эффективным.
Однако в варианте AI не нужно обязательно указывать FK из города в страну.В вашей модели (*) все города находятся в штатах, поэтому вы всегда можете получить страну через штат - повторный ввод дополнительной FK означает, что вам нужно больше проверки, чтобы гарантировать, что вы не можете назначить город стране, отличной отстрана его штата.
(* хотя имейте в виду, что это на самом деле не соответствует действительности: так или иначе, не во всех странах есть штаты, и даже в тех странах, где они есть, города, выпадающие за пределы всех штатов, например Канберра в Австралии)