2015-10-03 4 views
0

Для моего школьного проекта мне нужно было создать базу данных. Это моя 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?

+0

Почему, по вашему мнению, для таблицы 'Product' нужен внешний ключ на' Category.SubCategory'? В таблице 'Product' есть ссылка на' Category', а 'Category' имеет ссылку на' SubCategory'. Я думаю, что текущий 'DDL' в порядке, если' product' имеет ссылку на 'category', но не на подкатегорию –

+0

Подкатегории нужен родитель. Но вы можете присвоить товар категории без подкатегории. Так что мне нужно назначить продукт Category.Id или Category.SubCategoryId. – yooouuri

+0

SubCatagory - это категория, у которой есть родительский элемент, поэтому вам требуется ссылка на какую-либо категорию, независимо от того, имеет ли она родительский или нет, поэтому текущий DDL в порядке. Я прав? –

ответ

1

Ссылка на иностранный ключ принадлежит Категория таблица не имеет других таблиц. Это видно из диаграммы E-R. Вы даже обвели соответствующую ссылку.

Я хотел бы написать определение больше, как это:

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