Database design 图像数据库-一个表还是两个表?

Database design 图像数据库-一个表还是两个表?,database-design,relational-database,Database Design,Relational Database,我正在建立一个数据库来管理位于文件服务器上的图像文件。由于我是数据库界的新手,我在使用一个表还是两个表之间左右为难。以下是分类: 我需要以下列:imgId、imgTitle、imgClass、imgFamily和imgURL 我想知道是否最好将imgURL放在另一个表中,并使用imgID链接这两个表,或者它们是否都可以放在一个表中,并且运行良好 你觉得怎么样?如果你只存储图像URL——一个长度相当有限的字符串(最多几百个字符)——我看不出将该列拆分成单独的表有什么好处 如果您要存储图像本身(组成

我正在建立一个数据库来管理位于文件服务器上的图像文件。由于我是数据库界的新手,我在使用一个表还是两个表之间左右为难。以下是分类:

我需要以下列:
imgId、imgTitle、imgClass、imgFamily
imgURL

我想知道是否最好将
imgURL
放在另一个表中,并使用
imgID
链接这两个表,或者它们是否都可以放在一个表中,并且运行良好


你觉得怎么样?

如果你只存储图像URL——一个长度相当有限的字符串(最多几百个字符)——我看不出将该列拆分成单独的表有什么好处


如果您要存储图像本身(组成图像的字节),那么是的,在许多系统中,将此blob(二进制大对象)存储到单独的表中是有意义的。

如果您只存储图像URL—长度相当有限的字符串(最多几百个字符)-我认为将该列拆分为单独的表没有什么大的好处


如果您要存储图像本身(组成图像的字节),那么是的,在许多系统中,存储这个blob(二进制大对象)是有意义的将表拆分为一个单独的表。

您可能希望拆分表的主要原因是,在某些情况下,imgId和imgURL之间可能不存在一对一的匹配,就像同一URL的两个或多个ID一样;或引用多个URL的同一ID。(不过,空URL也可以。否则,您只需要一个表即可。

您可能希望拆分表的主要原因是,在某些情况下,imgId和imgURL之间可能不存在一对一的匹配-类似于同一URL的两个或多个ID;或者同一ID引用多个URL。(不过,空URL也可以。否则,您只需要一个表。

您所述的所有项目似乎都有一对一的关系;换句话说,对于一个标题或图像id,您可能不会有两个不同的URL

但是,另一个要考虑的是,这些字段是否可能经常是空的;是否有许多字段没有类,例如,或是家庭?如果是这样的话,可以考虑将数据放在单独的表中,并使用ID:< /P>链接到它。

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;
然后,您将使用左联接获取数据,因此,即使ImageAddition中没有行,也会获取图像中的数据:

SELECT i.imgId, i.imgTitle, i.imgURL, i.imgDate, ia.imgClass, ia.imgFamily
 FROM image i LEFT JOIN imageAddendum ia using ( imgId );

您声明的所有项目似乎都有一对一的关系;换句话说,对于一个标题或图像id,您可能不会有两个不同的URL

但是,另一个要考虑的是,这些字段是否可能经常是空的;是否有许多字段没有类,例如,或是家庭?如果是这样的话,可以考虑将数据放在单独的表中,并使用ID:< /P>链接到它。

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;
然后,您将使用左联接获取数据,因此,即使ImageAddition中没有行,也会获取图像中的数据:

SELECT i.imgId, i.imgTitle, i.imgURL, i.imgDate, ia.imgClass, ia.imgFamily
 FROM image i LEFT JOIN imageAddendum ia using ( imgId );

它不会改变答案,不会。但我确实编辑了答案;)我将date列添加到主“image”表中,因为我认为它是每个图像都有的,并为它添加了一个键,以便查询排序更快。唯一要考虑的是您是只想要一个日期,还是一个日期和时间;我给出的示例是一个日期和时间,但显然您可能只想要一个日期。而不是ks用于编辑。我使用phpMyAdmin创建我的列。键与什么有关?我了解主键,但不只是键。哦,有必要定义每种类型的长度/值吗?键是索引的另一个词。使用主键,只能有一行具有相同值。使用一个键,您可以有许多具有相同值的行。对于您的表,您可能希望imgId上有一个主键以确保它们是唯一的,但您可能希望保留imgDate键,因为您可能有许多来自同一日期(或日期时间)的图像。我不确定我是否理解最后一个问题。我还被告知,对于imgId,我应该使用自动增量。我是否正确地假设,如果我这样做,数据库将在我输入数据时自动定义id?在您的代码中,您将默认值设为0。如果您将该值设置为NULL,则您的假设是正确的;例如因此,“INSERT INTO image SET imgURL='foo';”将把imgId设置为下一个可用的整数,如您所说,如果使其自动递增。因此,默认值0应更改为非null。我将再次更改我的答案;)(我将int更改为unsigned,因为我讨厌有符号的int,除非您真的想要负数)它不会改变答案,不会。但我确实编辑了答案;)我将date列添加到主“image”表中,因为我认为它是每个图像都有的,并为它添加了一个键,以便查询排序更快。唯一要考虑的是您是只想要一个日期,还是一个日期和时间;我给出的示例是一个日期和时间,但显然您可能只想要一个日期。而不是ks用于编辑。我使用phpMyAdmin创建我的列。键与什么有关?我了解主键,但不只是键。哦,有必要定义每种类型的长度/值吗?键是索引的另一个词。使用主键,只能有一行具有相同值。使用一个键,您可以有许多具有相同值的行。对于您的表,您可能希望imgId上有一个主键以确保它们是唯一的,但您可能希望保留imgDate键,因为您可能有许多来自同一日期(或日期时间)的图像.我不确定我是否理解了最后一个问题。我还被告知,对于imgId,我应该使用自动增量。如果我这样做,数据库是否正确