一对多表链接到一对多表

时间:2013-05-19 12:58:17

标签: mysql sql database phpmyadmin

我是MySql的新手(3小时在我的腰带下),刚读完PHP& MYSQL for dummies第4版,我目前正在创建一个包含有关练习商店信息的数据库。

我正在尝试创建的数据库包含有关商店列表的信息。每个商店将包含有关商店,商店正在运营的行业(例如衣服,食品)以及库存的一些基本信息。

虽然我目前有一个表格,其中包含商店的名称,描述(可以是商店网站的简短记录和/或URL),以及商店ID(作为主键)

create table Merchant(

MerchantID      SERIAL,
Industry        ENUM("Retail","Dining","Entertainment"),
Name            VARCHAR(1000) NOT NULL,
Description     VARCHAR(1000),
PRIMARY KEY(MerchantID)
)

每个商店将有多个类别用于销售,每个类别将有多个商品。我是否正确地说我正在看的是一个(商店)到多个(类别)表链接到一个(类别)到多个(项目)表?原因是虽然第一个表(Store to Categories)具有一对多R / S,但第二个表(Category to Item)也有一对多,而不是多对多R / S,因为我只有查看包含多个项目的单一类别。

类别表:

Create table Categories(

CategoryID      SERIAL references MerchantID,
Category        VARCHAR(50) NOT NULL,
PRIMARY KEY(CategoryID)

)

项目表:

Create table Items(

ItemID      Serial references CategoryID,
Item        VARCHAR(50) NOT NULL,
PRIMARY KEY(ItemID)

)

上面的代码是否正确?或者我必须输入上面一级的所有主键。 E.g:

Create table Item(

MerchantID      SERIAL,
CategoryID      SERIAL,
ItemID          SERIAL,
Item            VARCHAR(50),
PRIMARY KEY(MerchantID,CategoryID,ItemID)
)

此外,使用VARCHAR(50)和VARCHAR(1000)之间是否存在任何区别,因为MYSQL会自动清除所有未使用的空间?还有,还有什么办法可以进一步优化数据库的性能等吗? / p>

3 个答案:

答案 0 :(得分:0)

您的计划存在一些问题。第一个是在商家表中使用枚举。通过为行业提供单独的表格,以后添加新行业会更容易。

您的类别语法可能无法运行。我不使用MySQL,但你拥有的对其他RDBMS无效。当您使用“references”关键字时,它应该在声明外键时。所以这个:

Create table Categories(
CategoryID      SERIAL references MerchantID,
Category        VARCHAR(50) NOT NULL,
PRIMARY KEY(CategoryID)
)

应该类似于:

Create table Categories(
CategoryID      SERIAL not null,
MerchantID integer not null,
Category        VARCHAR(50) NOT NULL,
PRIMARY KEY(CategoryID),
foreign key merchantID references (merchant.merchantID)
)

你的桌子都没有外键。如果您使用的那本书没有解决这些问题,我听说过“为临终关怀数据库设计”的好消息。

这些观察结果应该让你开始。

答案 1 :(得分:0)

我的第一反应/印象:

  1. 有一个商家表,ID,名称
  2. 考虑您是否需要ENUM用于行业,或者使其成为合适的表格
  3. 有一个项目表 - 不要像你正在尝试那样链接 - 这个应该只是关于项目
  4. 在单独的表格中将商品链接到商家 - item_id,merchant_id - 可能包含其他内容,例如此处的价格。
  5. 有一个分类表,id,名称,描述
  6. 将项目链接到类别。

答案 2 :(得分:0)

当你创建表之间的关系(一对多)时,你应该Primary Key(PK)到Foreign Key(FK),PK有一边而FK有很多边。在您的情况下,您使用FK以及Serial数据类型的概念是错误的。例如,您有这样的商家表(您的单面)结构:

create table Merchant(
 MerchantID      SERIAL,
 Industry        ENUM("Retail","Dining","Entertainment"),
 Name            VARCHAR(1000) NOT NULL,
 Description     VARCHAR(1000),
 PRIMARY KEY(MerchantID)
 )

然后你的相关表格类别(多面)

Create table Categories(
CategoryID      SERIAL references MerchantID,
Category        VARCHAR(50) NOT NULL,
PRIMARY KEY(CategoryID)

首先让我们解决Serial数据类型。 mySQL中的Serial数据类型实际上是一个BIGINT NOT NULL AUTO_INCREMENT数据类型,它对PK很有用。因此,在Category表中MerchantID是auto_increment,这是好的。现在,在您的类别表中,您的主键是CategoryID也是Serial,它是auto_increment,但它引用MerchantID。因此,例如,如果Store'A'有两个类别,那么Merchant表中PK的第一个值是1.现在在Category表中,因为它也是auto_increment,这意味着你有值1和2.其中1个值与Merchant的1值匹配,但2值不匹配,因为没有(除了您添加另一个商店)。换句话说,Merchant表中PK(MerchantID)的值与Categories表中的FK CategoryID值不一致。

换句话说,您不会在相关字段中使用Serial而只使用BIGINT,即MerchantID。所以,现在应该是这样的。

 create table Merchant(
 MerchantID      SERIAL,
 Industry        ENUM("Retail","Dining","Entertainment"),
 Name            VARCHAR(1000) NOT NULL,
 Description     VARCHAR(1000),
 PRIMARY KEY(MerchantID)
 )

Create table Categories(
MerchantID      BIGINT,
Category        VARCHAR(50) NOT NULL,
PRIMARY KEY(MerchantID, Category)
)

现在,既然你想在Category(One-side)和Items(Many-side)之间创建关系,那么你必须在表中保留CategoryID,现在将Categories表改为:

 Create table Categories(
 CategoryID      SERIAL,
 MerchantID      BIGINT,
 Category        VARCHAR(50) NOT NULL,
 PRIMARY KEY(CategoryID),
 FOREIGN KEY(MerchantID) references Merchant(MerchantID)
 )

现在在你的Items表中有一对多,也就是说,一个类别可能有很多项目,那么你的项目表格会变成这样:

Create table Items(
ItemID      Serial,
CategoryID  BIGINT,
Item        VARCHAR(50) NOT NULL,
PRIMARY KEY(ItemID),
FOREIGN KEY(CategoryID) references Categories(CategoryID)
)

这基本上是我的第二点。在这种情况下,作为多方的项目具有来自类别FK CategoryID的{​​{1}},其也是PK

我同意Dan Brauck你不使用Enum作为你的数据类型,因为它很难扩展或不灵活。因此,您的Merchant表现在应具有此结构。

CategoryID

我希望您也了解create table Merchant( MerchantID SERIAL, Industry VARCHAR(50) NOT NULL, Name VARCHAR(1000) NOT NULL, Description VARCHAR(1000), PRIMARY KEY(MerchantID) ) 概念,这在数据库设计中非常重要。如下面的链接:

Normalization
相关问题