两列上的外键

时间:2015-10-03 08:09:13

标签: sql oracle oracle11g erd subtyping

对于我的学校项目,我需要创建一个数据库。这是我的ERD。

ERD

在SQL中我创建了Category表:

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")
);

product表在Category.Id上有一个CategoryId(外键),但Product.CategoryId在Category.SubCategoryId上也需要一个外键。

这是可能的,还是应该创建一个名为" SubCategory"的额外表格。然后将外键添加到Category.Id和SubCategory.Id?

1 个答案:

答案 0 :(得分:1)

外键引用属于 Category 表,而不属于任何其他表。从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 keyreferences