我有一张巨大的桌子和书籍#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");
答案 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)
)