我正在组建一个数据库来管理位于文件服务器上的图像文件。由于我是数据库世界的新手,我在使用一个或两个表之间徘徊。这是细分:
我需要以下列:imgId, imgTitle, imgClass, imgFamily
和imgURL
。
我想知道将imgURL
放在另一个表中imgID
将两者连接在一起,或者它们是否可以在一个表中一起使用,并且运行正常。
您怎么看?
答案 0 :(得分:1)
如果您只存储图片网址 - 一个相当有限长度的字符串(最多几百个字符) - 我认为将该列拆分为单独的表格没有任何大的好处。
如果你要存储图像本身(构成图像的字节) - 那么是的,在许多系统中,将这个blob(二进制大对象)存储到一个单独的表中是有意义的。
答案 1 :(得分:1)
您可能想要拆分表的主要原因是,如果在某些情况下imgId和imgURL之间可能没有一对一的匹配 - 就像同一个URL的两个或更多ID一样;或相同的ID引用多个URL。 (但是,空URL很好。否则,你可以使用一个表。
答案 2 :(得分:1)
您所声明的所有项目似乎都具有一对一的关系;换句话说,对于一个标题或图片ID,您可能不会有两个不同的URL。
然而,另一件需要考虑的事情是,是否有任何字段可能经常是空的;他们中的很多人会没有课,例如家庭?如果是这种情况,您可以考虑将该数据放在一个单独的表中,并使用id:
链接到它CREATE TABLE `image` (
`imgId` int(10) unsigned NOT NULL AUTO_INCREMENT,
`imgTitle` varchar(255) DEFAULT NULL,
`imgURL` varchar(255) DEFAULT NULL,
`imgDate` datetime DEFAULT NULL,
PRIMARY KEY (`imgId`),
KEY `date` (`imgDate`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
CREATE TABLE `imageAddendum` (
`imgId` int(11) NOT NULL DEFAULT '0',
`imgClass` varchar(255) DEFAULT NULL,
`imgFamily` varchar(255) DEFAULT NULL,
PRIMARY KEY (`imgId`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
然后,您将使用LEFT JOIN获取数据,即使imageAddendum中没有行,也可以获得图像中的数据:
SELECT i.imgId, i.imgTitle, i.imgURL, i.imgDate, ia.imgClass, ia.imgFamily
FROM image i LEFT JOIN imageAddendum ia using ( imgId );