0

对于我的学校项目,我需要创建一个数据库。这是我的 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")
);

产品表在 Category.Id 上有一个 CategoryId(外键),但 Product.CategoryId 还需要 Category.SubCategoryId 上的外键。

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

4

1 回答 1

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
于 2015-10-03T11:54:16.033 回答