假设我有可以是浪漫,小说或神秘的书籍。我有2个现实的选项来存储这些数据。一种是在我的书籍表中有一个类型列,它是一个值为“浪漫”,“小说”或“神秘”的字符串。另一种是创建book_types表并将类型存储在那里。然后我的书会有一个引用book_types表的type_id外键。
我的问题是我如何选择最好的?我已经看到Restful authentication Rails插件中使用的字符串方法,其中包含有关用户状态的信息 - 'inactive','active','pending'...
考虑到我将一直查询此信息,是否会因使用查找表方法而受到性能影响?
谢谢!
答案 0 :(得分:3)
外键方法将表现更好。字符串比较会降低速度。比较数字要快得多。
如果要进一步加快查询速度,请在用于引用外键的列上添加索引。与主键不同,不会自动为外键创建索引。
答案 1 :(得分:1)
如果没有更多的信息要存储,那么字符串通常很好(尽管这是一个非瞬态值,因此它不是正常形式)。
这似乎是表格的一个很好的候选者,所以你可能想要对类别做更多的事情,所以它应该是一个参考表,imo。
答案 2 :(得分:1)
在大多数情况下,使用外键到单独表的方法是最好的 - 优点:
单独的表格为您提供了一个 可扩展的方式来验证条目。在表定义中放置硬编码检查约束 然后需要一个ALTER TABLE来添加一个 新类型
如果您因某种原因需要更改类型文本(例如“浪漫” - >“女性小说”作为蹩脚示例),您只需对查找表进行轻量级更新。
您可以想象还有没有条目的类型,单独的表允许您使用外部联接在SQL结果集中包含该类型。
从界面角度来看,使用单独的表可以轻松生成不需要在UI中进行硬编码的类型下拉列表。
就性能而言,使用FK上的正确索引,任何RDBMS引擎都将表现良好 - 连接是RDBMS的设计目标。
答案 3 :(得分:0)
我会用fk。 信息较少重复。
编辑: Betther解决方案: MySql代码:
CREATE TABLE books
(
id int AUTO_INCREMENT not null,
book_type enum('romance', 'fiction', 'mystery') not null,
....
);