Модель базы данных Parent Child с одним дочерним элементом по умолчанию. - PullRequest
1 голос
/ 09 февраля 2012

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

Я могу придумать два пути. Что лучше или есть другая лучшая альтернатива?

   - ParentTable
      - Id

   - ChildTable
      - Id
      - ParentId
      - IsDefault

или

   - ParentTable
      - Id
      - DefaultChildId

   - ChildTable
      - Id
      - ParentId

Ответы [ 2 ]

2 голосов
/ 09 февраля 2012

Я предпочитаю модели данных, которые вообще предотвращают существование недействительных данных. Если вы используете второй подход и создаете отношение внешнего ключа между DefaultChildId и ChildTable, то вы можете добавить ограничения, чтобы гарантировать, что ваша база данных никогда не будет в недопустимом состоянии - если вы попытаетесь, скажем, удалить дочерний элемент, это чей-то ребенок по умолчанию, база данных помешает вам. При первом подходе это не так.

В частности (как отмечено в комментарии), ограничение ON DELETE RESTRICT должно использоваться для DefaultChildId и ON DELETE CASCADE для ParentID. Это позволяет создавать записи с большей гибкостью (вам не нужно иметь дочерний элемент по умолчанию, чтобы иметь возможность создать родительский элемент), предотвращать случайное удаление дочернего элемента по умолчанию без предварительного обновления до нового по умолчанию и интеллектуально обрабатывает удаление родитель.

0 голосов
/ 09 февраля 2012

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

SQL также немного яснее

Сравните

SELECT * 
FROM   parenttable p 
       INNER JOIN childtable c 
         ON p.id = c.parentid 
            AND c.isdefault = 1 

против

SELECT * 
 FROM   parenttable p 
     INNER JOIN childtable c 
       ON p.defaultchildid = c.id 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...