【问题标题】:If I have multiple types of an object, when should object.type be a string and when should it be a foreign key?如果我有多种类型的对象,object.type 什么时候应该是字符串,什么时候应该是外键?
【发布时间】:2009-06-17 06:18:10
【问题描述】:

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

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

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

谢谢!

【问题讨论】:

    标签: database-design foreign-keys associations lookup-tables


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      如果不再需要存储更多信息,则字符串通常是可以的(尽管这是一个非瞬态值,因此它不是正常形式)。

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

      【讨论】:

        【解决方案3】:

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

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

        • 如果您出于某种原因需要更改类型文本(例如,“romance”->“women's fiction”,这是一个蹩脚的例子),您只需对查找表进行轻量级更新。

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

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

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

        【讨论】:

          【解决方案4】:

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

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

          CREATE TABLE books
          (
              id int AUTO_INCREMENT          not null,
              book_type enum('romance', 'fiction', 'mystery')     not null,
              ....
          );
          

          【讨论】:

          • 并非所有数据库都有枚举类型。以这种方式添加新类别是否容易?
          • @uncleo:这就是我写“mysql 代码”的原因。关于添加新类别:显然正确的解决方案取决于他的需求。如果 book_type 不会改变,枚举就可以了。
          • 我的意思是这是一个合理的问题。我以前从未使用过枚举。我想知道如果将列修改为不同的枚举会发生什么。如果在末尾添加一个新值,它会正确保留旧值吗?
          • @uncleo:哦,我的错。可以使用更改表来完成。类似于: ALTER TABLE 书籍修改列 book_type enum('romance', 'fiction', 'mystery', 'new_type');
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-09-07
          • 1970-01-01
          • 1970-01-01
          • 2022-01-02
          • 2011-01-18
          • 2011-08-18
          • 2017-03-21
          相关资源
          最近更新 更多