Внешний ключ на две колонки
Для моего школьного проекта мне нужно было создать базу данных. Это мой ERD.
В SQL я создаю таблицу категорий:
CREATE table "Category" (
"Id" NUMBER(5) NOT NULL,
"SubCategoryId" NUMBER(5) NULL,
"Name" VARCHAR2(32) NOT NULL,
CONSTRAINT "Category_pk" PRIMARY KEY ("Id")
);
ALTER TABLE "Category" ADD CONSTRAINT "Category_fk" FOREIGN KEY ("SubCategoryId") REFERENCES "Category" ("Id");
Таблица продуктов
CREATE table "Product" (
"Id" NUMBER(5) NOT NULL,
"CategoryId" NUMBER(5) NOT NULL, /* Category.Id or Category.SubCategoryId */
"Name" VARCHAR2(32) NOT NULL,
"Brand" VARCHAR2(32),
"Type" VARCHAR2(32),
"Year" NUMBER(4),
CONSTRAINT "Product_pk" PRIMARY KEY ("Id")
);
Таблица продуктов имеет CategoryId (внешний ключ) для Category.Id, но для Product.CategoryId также необходим внешний ключ для Category.SubCategoryId.
Это возможно, или я должен создать дополнительную таблицу с именем "SubCategory", а затем добавить внешние ключи в Category.Id и SubCategory.Id?
1 ответ
Ссылка на внешний ключ принадлежит таблице Category, а не какой-либо другой таблице. Это ясно из диаграммы ER. Вы даже обвели соответствующую ссылку.
Я бы написал определение больше так:
CREATE table Category (
CategoryId NUMBER(5) NOT NULL,
SubCategoryId NUMBER(5) NULL,
Name VARCHAR2(32) NOT NULL,
CONSTRAINT Category_pk PRIMARY KEY (CategoryId),
CONSTRAINT fk_Category_SubCategory FOREIGN KEY (SubCategoryId) REFERENCES Category(CategoryId)
);
Заметки:
- Не используйте двойные кавычки для имен таблиц и столбцов. Они просто затрудняют написание и чтение кода. Как следствие, не используйте зарезервированные слова, пробелы или другие плохие символы в таких именах.
- Я называю первичный ключ таблицы, чтобы включить имя таблицы. Таким образом, большинство столбцов внешнего ключа имеют точно такое же имя, что и столбцы первичного ключа.
- Я рекомендую вам назвать все ограничения, а не просто
primary key
а такжеreferences
в строке определения столбца.