在SQL表中存储分类引用的最佳方法是什么?

时间:2010-06-05 20:33:16

标签: sql mysql database-design enums statistics

我想在MySQL数据库表中存储大量的分类数据。让我们说,例如我想了解“小部件”的信息,并希望以某种方式对属性进行分类,即形状类别。

例如,小部件可以分类为:圆形,方形,三角形,球形等。 这些类别是否应存储在表中以便从应用程序中最佳地引用它们?我想,另一种可能性是向包含一个包含一个小int的形状列的小部件添加一个列。这样我的应用程序可以通过它搜索形状,然后使用一个协调枚举类型来映射形状int意义。

哪个最好?还是有另一种我还没想到的解决方案吗?

3 个答案:

答案 0 :(得分:3)

为每个属性分组定义类别表。 IE:

WIDGET_SHAPE_TYPE_CODES

  • WIDGET_SHAPE_TYPE_CODE(主键)
  • 说明

然后在WIDGETS表中使用外键引用:

WIDGETS

  • WIDGET_ID(主键)
  • ...
  • WIDGET_SHAPE_TYPE_CODE(外键)

这具有可移植到其他数据库的好处,以及更明显的关系,这意味着更简单的维护。

答案 1 :(得分:1)

我要做的是从一个Widgets表开始,该表具有一个数字类型的类别字段。如果还使用类别表,则数字类别是与类别表中的行相关的外键。数字类型很好,小而且性能更好。

您可以选择添加包含主键数值和文本说明的类别表。这将数值与人类友好文本值匹配。如果您只想直接从数据库运行报表,则可以使用此表将数字转换为文本。拥有此表的好处是,如果添加新类别,则无需更新可执行文件。我会在我的设计中添加这样一个表格。

MySQL的ENUM很方便,但它将表作为字符串存储在表中,因此它在表中占用的空间比实际需要的多。但是,它确实具有防止存储未识别的值的优点。可以防止存储无效数值,但不能像ENUM那样优雅。 ENUM的另一个问题是因为它被视为字符串,如果您按值选择数据库必须做更多工作,因为不是比较单个数字,而是必须比较多个字符。

如果您真的想要,您可以在代码中使用枚举,将数字类别转换回更适合应用程序代码的内容,但是这样做会使代码更难以维护。但是,它可以具有性能优势,因为运行查询时必须返回更少的字节。我会尽量避免这种情况,因为每次将类别添加到数据库时都需要更新应用程序代码。如果你真的需要从数据库中挤出性能,你可以选择整个类别表,并选择小部件表并将它们合并到应用程序代码中,但这是一种罕见的情况,因为数据库客户端几乎总是与数据库快速连接服务器和网络上的几个字节是无关紧要的。

答案 2 :(得分:0)

我认为最好的方法是使用ENUM,例如mysql中有预定义的枚举类型 - http://dev.mysql.com/doc/refman/5.0/en/enum.html