Джанго: следуя в обратном направлении отношений один-к-одному - PullRequest
2 голосов
/ 26 сентября 2011

У меня есть вопрос о том, как Django моделирует отношения один-к-одному.

Предположим, у нас есть 2 модели: A и B:

class B(models.Model):
      bAtt = models.CharField()

class A(models.Model):
      b = models.OneToOneField(B)

В созданной таблице A есть поле "b_id", но в таблице B, созданной Django, нет такого поля, как "a_id".

Таким образом, для объекта A очень быстро получить соответствующий объект B, просто через столбец "b_id" строки A.

Но как Django получает объект A по объекту B?

Наихудший случай - сканирование таблицы A для поиска B.id в столбце "b_id". Если да, то целесообразно ли вводить вручную дополнительное поле "a_id" в модели и таблице B?

Заранее спасибо!

Ответы [ 3 ]

2 голосов
/ 26 сентября 2011

Достаточно сохранить идентификатор в одной из таблиц.

В случае 1, (a.b) сгенерированный SQL будет

SELECT * from B where b.id = a.b_id

, а в случае 2 SQL будет:

SELECT * from A where a.b_id = b.id

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

Практически во всех случаях индексация должна быть достаточной, и производительность будет хорошей, если у вас только 1 идентификатор.

2 голосов
/ 26 сентября 2011

Другие объектно-реляционные картографы требуют, чтобы вы определяли отношения с обеих сторон.Разработчики Django считают, что это нарушение принципа СУХОЙ (не повторяйся), поэтому Django требует, чтобы вы определяли отношения только на одном конце.взгляд на документ ;)

2 голосов
/ 26 сентября 2011

Django извлекает поле с помощью JOIN в SQL, эффективно объединяя строки двух таблиц, где b_id соответствует B.id.

Допустим, у вас есть следующие таблицы:

# Table B
| id | bAtt    |
----------------
|  1 | oh, hi! |
|  2 | hello   |

# Table A
| id | b_id |
-------------
| 3  |  1   |
| 4  |  2   |

Тогда объединение на B.id = b_id создаст следующие кортежи:

| B.id | B.bAtt  | A.id |
------------------------
|  1   | oh, hi! |  3   |
|  2   | hello   |  4   |

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...