我是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>
答案 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)
我的第一反应/印象:
答案 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