Внешний ключ на две колонки

Для моего школьного проекта мне нужно было создать базу данных. Это мой ERD.

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 в строке определения столбца.
Другие вопросы по тегам