适用于仅存储少量值的解决方案 - 列或表?

时间:2015-03-12 07:47:07

标签: php mysql database

我有一张巨大的桌子和书籍#39;如果我计划为媒体类型添加一行,我会将图书信息存储起来,让我们将其称为“media_ID”。我知道我在这里只处理三种可能的价值观:书籍,电子书和有声读物。

因此,在这三个值中单独制作一个表似乎就像浪费一样,特别是当我必须将它包含在每个对我来说都没有必要的查询中时。那么这种情况的清洁解决方案是什么?也许在配置文件中使用PHP数组?你在用什么?

books
-------
ID
media_ID
title
...

medias
-------
ID
type

MySQL数据:

CREATE `books` (
  `ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `media_ID` tinyint(4) NOT NULL DEFAULT '1',
  `title` tinytext NOT NULL,
  )

INSERT INTO `books` (`ID`, `media_ID`, `title`) VALUES
(1, 1, 'Some print book title'),
(2, 1, 'Other print book title'),
(3, 2, 'First ebook title'),
(4, 2, 'Second ebook title'),
(5, 3, 'Single audio book title');

CREATE TABLE `medias` (
  `ID` tinyint(4) NOT NULL AUTO_INCREMENT,
  `type` tinytext NOT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;

INSERT INTO `medias` (`ID`, `Medium`) VALUES
(1, 'book'),
(2, 'ebook'),
(3, 'audiobook');

或者只是php数组:

$medias = array("book", "ebook", "audiobook");

3 个答案:

答案 0 :(得分:4)

仅为3个值使用单独的表并非不寻常。 此外,如果需要,这将为您提供在未来添加更多属性的选项......这将是ENUM列类型的问题。 在我的应用程序中...我有一个存储用户选择的付款包的表...这些只有三个。 如果您不确定未来的需求/要求,请选择表格。

答案 1 :(得分:2)

就我个人而言,我会使用enum

    `mediaType` ENUM('book', 'ebook', 'audiobook') not null

答案 2 :(得分:0)

也可以使用查找表来处理enumaration。刚刚在这里找到了解决方案:How to handle enumerations without enum fields in a database

CREATE `books` (
  `ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `media` tinyint(4) NOT NULL DEFAULT '1',
  `title` tinytext NOT NULL,
  FOREIGN KEY (media) REFERENCES medias(Medium)
  )