Как правильно формировать структру БД по части связей? Сперва надо определиться какой тип связи данных используется: один к одному, один ко многим, многие ко многим. Здесь мы поговорим про самый распространённый тип «один ко многим» на примере СУБД MySQL.
Один ко многим это когда одна запись может быть связана со многими, но каждая из этих многих записей может быть связана только с одной. E.g., есть категории, которые могут иметь вложенность. Каждая категория может иметь подкатегории, i.e. каждая категория может иметь одну родительскую категорию. В таком случае нужна лишь одна общая таблица категорий, где есть у каждой строки есть поле, указывающее на родителя, e.g., parent_id
. I.e. действует обратный метод логики проектирования, когда дочерние объекты указывают на родительский, а не наоборот.
Если делать наоборот, когда родительский объект указывает на все свои дочерние, как казалось бы должно быть изначально по прямой логике, то обязательно придётся городить дополнительную таблицу в которой бы указывались эти связи. Однако, если действовать от обратного, то достаточно одной таблицы с одним дополнительным полем parent_id
в котором каждый дочерний объект указывает на родительский. Более того, благодаря этому одному единственному полю (скажем, parent_id
) родительская категория также может явно объявить себя таковой, e.g., указав свой id
в поле parent_id
, или просто указав там 0, что также может быть полноценным значением, а не его отсутствием, ведь для отсутствия значения для целочисленного типа, e.g., int
, есть такие значения как NULL
и -1
.
С другой стороны, не всё так просто с условием «указывать 0 если нет родителя». При использовании составного UNIQUE KEY
использовать NULL
нецелесообразно, отрицательные значения недопустимы для INT
с флагом UNSIGNED
, который часто выбирается для того чтобы в 2 раза увеличить максимальный лимит, а просто пустая строка («пустота») недоступна для числовых значений. В таком случае в качестве отсутствующего значения остаётся только 0, который и будет использоваться по-умолчанию. Тогда для родительской строки в поле parent_id
остаётся только указывать её собственный id
т.к. 0 в этом столбце будет в качестве отсутствующего значения.