База данных изображений - одна таблица или две? - PullRequest
0 голосов
/ 13 августа 2011

Я собираю базу данных для управления файлами изображений, расположенными на файловом сервере. Поскольку я новичок в мире баз данных, я разрываюсь между использованием одной таблицы или двух. Вот разбивка:

Мне нужны столбцы для: imgId, imgTitle, imgClass, imgFamily и imgURL.

Мне интересно, будет ли лучше поместить imgURL в другую таблицу с imgID, связывающей два, или все они могут быть вместе в одной таблице и нормально функционировать.

Что ты думаешь?

Ответы [ 3 ]

1 голос
/ 13 августа 2011

Основная причина, по которой вы захотите разделить таблицы, заключается в том, что существует вероятность того, что в некоторых случаях может не быть совпадения один к одному между imgId и imgURL - например, два или более идентификаторов для одного и того же URL; или один и тот же идентификатор, ссылающийся на более чем один URL. (Пустой URL, однако, будет в порядке. В противном случае, вы будете в порядке с одной таблицей.

1 голос
/ 14 августа 2011

Все предметы, которые вы указали, имеют отношение один к одному; другими словами, у вас, вероятно, не будет двух разных URL для одного заголовка или идентификатора изображения.

Однако, другой момент, который необходимо учитывать, заключается в том, могут ли какие-либо поля быть пустыми довольно часто; Например, у многих из них нет класса или семьи? Если это так, вы можете поместить эти данные в отдельную таблицу и связать их с помощью идентификатора:

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 );
1 голос
/ 13 августа 2011

Если вы храните только URL-адрес изображения - строку довольно конечной длины (максимум несколько сотен символов) - я не вижу большого преимущества в разбивке этого столбца на отдельную таблицу.

Если вы будете хранить само изображение (байты, составляющие изображение) - тогда да, во многих системах имеет смысл хранить этот большой двоичный объект (большой двоичный объект) в отдельной таблице.

...