【问题标题】:An Acceptable MySQL Table Layout [closed]可接受的 MySQL 表布局 [关闭]
【发布时间】:2013-08-05 15:47:58
【问题描述】:

这是我第一次尝试创建具有多个表的这种性质的数据库。

项目:一个只需要展示下一个拍卖目录的拍卖行

表格布局:

  • 每年将有 4-5 个新目录,每次新拍卖 1 个目录
  • 每个目录都将分为通用子类别,例如“家具”、“玻璃器皿”等...
  • 每个子类别都将填充独特的地段
  • 每件拍品都有唯一的拍品编号、标题、简要说明、照片、估价

我只是想弄清楚我最初的尝试;我的结构/术语是否正确?

我已经运行了一些将表连接在一起的查询,我正在获取我请求的数据。

在进行此操作之前,我只是希望有更多知识/经验的人让我放心,这会持续下去。

任何关于此的指针将不胜感激,或者一个简单的“代码将保留”:)

DROP TABLE IF EXISTS catalogues;
CREATE TABLE IF NOT EXISTS catalogues (
catalogueid INT(11) NOT NULL AUTO_INCREMENT,
active TINYINT (1) DEFAULT '0',
auctiondate VARCHAR(15) DEFAULT NULL,
datecreated TIMESTAMP DEFAULT '0000-00-00 00:00:00',
lastmodified TIMESTAMP DEFAULT now() ON UPDATE now(),
PRIMARY KEY (catalogueid),
KEY catalogue (auctiondate)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

INSERT INTO catalogues (active, auctiondate, datecreated,
lastmodified) VALUES
(0, '01-Jan-13', null, null),
(1, '01-Feb-13', null, null);


DROP TABLE IF EXISTS categories;
CREATE TABLE IF NOT EXISTS categories (
categoryid INT(11) NOT NULL AUTO_INCREMENT,
category VARCHAR(20) DEFAULT NULL,
PRIMARY KEY (categoryid),
KEY category (category(5))
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

INSERT INTO categories (category) VALUES
('Category 1'),
('Category 2'),
('Category 3'),
('Category 4');


DROP TABLE IF EXISTS lots;
CREATE TABLE IF NOT EXISTS lots (
lotid INT(11) NOT NULL AUTO_INCREMENT,
lotnumber INT(11) DEFAULT NULL,
title VARCHAR(128) DEFAULT NULL,
catalogueid INT(11) NOT NULL,
categoryid INT(11) NOT NULL,
estimatefrom INT(5) DEFAULT NULL,
estimateto INT(5) DEFAULT NULL,
photo VARCHAR(50) DEFAULT NULL,
datecreated TIMESTAMP DEFAULT '0000-00-00 00:00:00',
lastmodified TIMESTAMP DEFAULT now() ON UPDATE now(),
PRIMARY KEY (lotid),
KEY title (title(20)),
FOREIGN KEY (catalogueid) REFERENCES catalogues (catalogueid),
FOREIGN KEY (categoryid) REFERENCES categories (categoryid)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=0;

INSERT INTO lots (lotnumber, title, catalogueid, categoryid,
estimatefrom, estimateto, photo, datecreated, lastmodified) VALUES
(1, 'Title 1', 1, 1, '1000', '1500', 'photo-1.jpg', null, null),
(5, 'Title 2', 1, 2, '500', '800', 'photo-2.jpg', null, null),
(10, 'Title 3', 2, 3, '80', '120', 'photo-3.jpg', null, null),
(15, 'Title 4', 2, 4, '1000', '1500', 'photo-4.jpg', null, null);


DROP TABLE IF EXISTS lotdescription;
CREATE TABLE IF NOT EXISTS lotdescription (
lotid INT(11) NOT NULL AUTO_INCREMENT,
description VARCHAR(500) DEFAULT NULL,
FULLTEXT KEY description_2 (description),
FOREIGN KEY (lotid) REFERENCES lots (lotid)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

INSERT INTO lotdescription (description) VALUES
('Lot Description 1'),
('Lot Description 2'),
('Lot Description 3'),
('Lot Description 4');

【问题讨论】:

  • 为什么将批次描述作为单独的表格?看来这将与地块具有一对一的关系,因此是要包含在地块表中的地块的属性。您如何将拍品与目录联系起来?
  • 一张便条。我更喜欢表名是单数而不是复数-名称应该描述该表中的单个行-而不是集合。您是否打算每批有多个描述?
  • @MikeBrant 好点。阅读后,我沿着这条路线走下去,为了搜索目的,拆分大块内容可能更有效。毫无疑问,我搞错了,对于这个例子,将两者结合起来会更好。感谢您的输入
  • @Randy 他们将是每个批次的一个描述。 “名称应该描述该表中的单个 ROW - 而不是集合”,谢谢!

标签: mysql database database-schema


【解决方案1】:

拍卖实际上是包含一些额外信息的目录,例如拍卖日期。您用“目录”表描述的实际上是一个拍卖,所以我将该表命名为“拍卖”。但这有点纯粹。

您选择创建一个单独的类别表并将每个批次链接到一个类别,这在我看来是完全正确的,因为类别和批次之间存在一对多的关系。如果您希望多个类别中存在很多,您可以选择将其转换为多对多关系。

我不明白的一件事是您为什么选择创建一个单独的 lotdescription 表。很多和它的描述之间不是一对一的关系吗?如果是这样,您只需在批次表中添加一个“描述”字段。

// 在我打字的时候,我的最后一句话好像已经被回答了

【讨论】:

  • 我同意您对目录表的看法,出于某种原因,我一直专注于“目录”。我会将批次描述重新组合到批次表中。感谢您的反馈,对自学很有帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-23
  • 1970-01-01
  • 1970-01-01
  • 2018-02-01
  • 2010-09-13
  • 1970-01-01
相关资源
最近更新 更多