图像数据库 - 一个或两个表?

时间:2011-08-13 19:46:03

标签: database-design relational-database

我正在组建一个数据库来管理位于文件服务器上的图像文件。由于我是数据库世界的新手,我在使用一个或两个表之间徘徊。这是细分:

我需要以下列:imgId, imgTitle, imgClass, imgFamilyimgURL

我想知道将imgURL放在另一个表中imgID将两者连接在一起,或者它们是否可以在一个表中一起使用,并且运行正常。

您怎么看?

3 个答案:

答案 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 );