Разработка базы данных Django - Null Forign Keys - PullRequest
1 голос
/ 28 января 2011

У меня есть модель Django с моделью Person:

class Person(models.Model):
  # Personal details
  first_name = models.CharField(max_length=50)
  middle_name = models.CharField(max_length=50, blank=True, null=True)
  last_name = models.CharField(max_length=50)
  gender = models.CharField(max_length=1, choices=GENDER_CHOICES)
  date_of_birth = models.DateField()

  # Address
  street_address = models.CharField(max_length=50)
  suburb = models.CharField(max_length=30)
  postcode = models.CharField(max_length=4)
  state = models.CharField(max_length=3, choices=STATE_CHOICES)

  #Contact Details
  email = models.EmailField()

  # Family
  spouse = models.ForeignKey('self', null=True, blank=True)
  children = models.ManyToManyField('self', null=True, blank=True)

  home_church = models.ForeignKey('Church', null=True, blank=True)

Поле "middle_name" обнуляемо, я не думаю, что есть способ избежать этого, не так ли?

Тем не менее, у меня также есть Nullable ForeignKey для супруга, рекурсивный ManyToManyField для их детей и Nullable ForeignKey для церкви (при необходимости).

Мой вопрос - во-первых, каков текущий консенсус по допускаемым значениям внешних ключей? Должен ли я разрешить это здесь, или я должен создать какую-то "никому" или "неназначенную" модель, чтобы представлять отсутствие супруга / домашней церкви?

Или есть какой-то другой способ, которым я могу переделать этот дизайн в Джанго, чтобы приспособиться к этому?

И если я продолжу с нулевыми FK, есть ли какие-то предостережения в Django, о которых мне нужно знать? (осталось присоединиться?)

Cheers, Victor

Ответы [ 3 ]

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

Обнуляемые внешние ключи, реализованные большинством СУБД, не имеют большого логического смысла.Есть также некоторые несоответствия между способами, которыми различные СУБД обрабатывают их.В результате обнуляемые внешние ключи могут привести к неверным результатам.Их легко избежать, просто переместив соответствующие атрибуты в новую таблицу и заполнив эту таблицу, только если у вас есть значение для ее заполнения.

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

Когда внешний ключ помечен как null = True, Django будет обрабатывать СОЕДИНЕНИЯ с LEFT OUTER JOIN, по крайней мере, с базой данных Oracle AFAIK, поэтому никаких проблем нет.

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

Нуль отлично. В коде Python None будет представлять Null.

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

Django 1.3 вводит аргумент on_delete , который делает это намного проще.

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