2

假设我有一些可以是浪漫、小说或神秘的书。我有 2 个现实的选项来存储这些数据。一种是在我的 books 表中有一个 type 列,它是一个值为“romance”、“fiction”或“mystery”的字符串。另一种是创建一个 book_types 表并将类型存储在其中。然后我的书会有一个 type_id 外键引用 book_types 表。

我的问题是如何选择最好的?我已经看到了在 Restful 身份验证 Rails 插件中使用的字符串方法,其中包含有关用户状态的信息 - 'inactive'、'active'、'pending'...

考虑到我将一直查询此信息,使用查找表方法是否会影响性能?

谢谢!

4

4 回答 4

3

外键方法会表现得更好。字符串比较会减慢速度。比较数字要快得多。

如果您想进一步加快查询速度,请在用于引用外键的列上添加索引。与主键不同,索引不会自动为外键创建。

于 2009-06-17T06:31:05.213 回答
1

如果没有更多的信息要存储在某个东西上,字符串通常是可以的(尽管这是一个非瞬态值,所以它不是正常形式的)。

然而,这似乎是一个很好的表格候选者,因此您可能希望对类别进行更多操作,因此它应该是一个参考表,imo。

于 2009-06-17T06:21:03.903 回答
1

在大多数情况下,使用单独表的外键的方法是最好的 - 优点:

  • 单独的表为您提供了一种可扩展的方式来验证条目。在表定义中放置一个硬编码的检查约束然后需要一个 ALTER TABLE 来添加一个新类型

  • 如果您出于某种原因需要更改类型文本(例如,对于一个蹩脚的示例,“浪漫”->“女性小说”),您只需对查找表进行轻量级更新。

  • 可以想象,您可能拥有尚无条目的类型,并且单独的表允许您使用外连接将类型包含在 SQL 结果集中。

  • 从界面的角度来看,单独的表格让您可以轻松地生成不需要在 UI 中进行硬编码的类型的下拉列表。

就性能而言,通过 FK 上的适当索引,任何 RDBMS 引擎都会表现良好 - 连接是 RDBMS 的设计目的。

于 2009-06-17T12:37:17.160 回答
0

我会用fk。更少的信息重复。

编辑:更好的解决方案:MySql 代码:

CREATE TABLE books
(
    id int AUTO_INCREMENT          not null,
    book_type enum('romance', 'fiction', 'mystery')     not null,
    ....
);
于 2009-06-17T06:22:30.220 回答