在SQL表中存储分类引用的最佳方法是什么?
我想在MySQL数据库表中存储大量的分类数据。比如说,我想查看有关小部件的信息,并想以某种方式对属性进行分类,即形状类别 例如,小部件可以分为:圆形、方形、三角形、球形等。 这些类别是否应该存储在表中,以便从应用程序中最好地引用它们?我可以想象,另一种可能性是,在小部件中添加一列,其中包含一个包含微小int的shape列。这样,我的应用程序就可以通过该列搜索形状,然后使用一个协调枚举类型来映射shape int的含义在SQL表中存储分类引用的最佳方法是什么?,sql,mysql,database-design,enums,statistics,Sql,Mysql,Database Design,Enums,Statistics,我想在MySQL数据库表中存储大量的分类数据。比如说,我想查看有关小部件的信息,并想以某种方式对属性进行分类,即形状类别 例如,小部件可以分为:圆形、方形、三角形、球形等。 这些类别是否应该存储在表中,以便从应用程序中最好地引用它们?我可以想象,另一种可能性是,在小部件中添加一列,其中包含一个包含微小int的shape列。这样,我的应用程序就可以通过该列搜索形状,然后使用一个协调枚举类型来映射shape int的含义 哪一个最好?或者还有其他我还没有想到的解决方案吗?我认为最好的方法是使用枚举,
哪一个最好?或者还有其他我还没有想到的解决方案吗?我认为最好的方法是使用枚举,例如mysql中有预定义的枚举类型-为每个属性分组定义一个类别表。即: 小部件\u形状\u类型\u代码 小部件\u形状\u类型\u代码主键 描述 然后在WIDGETS表中使用外键引用: 小部件 控件ID主键 ... 小部件\u形状\u类型\u代码外键
这样做的好处是可以移植到其他数据库,并且关系更明显,这意味着维护更简单。我要做的是从一个Widgets表开始,它有一个数字类型的category字段。如果还使用类别表,则数字类别是与类别表中的行相关的外键。为了获得更好的性能,数字类型很好而且很小 (可选)可以添加包含主键数值和文本说明的类别表。这将数字值与人性化文本值相匹配。如果您只想直接从数据库运行报告,可以使用此表将数字转换为文本。拥有此表的好处是,如果添加了新类别,则不需要更新可执行文件。我会在我的设计中添加这样一个表格 MySQL的枚举很方便,但它将int作为字符串存储在表中,因此它占用了表中比实际需要更多的空间。但是,它确实具有防止存储无法识别的值的优点。防止存储无效数值是可能的,但不像枚举那样优雅。ENUM的另一个问题是,它被视为一个字符串,如果按值选择,则数据库必须做更多的工作,因为必须比较多个字符,而不是比较单个数字
如果你真的想,你可以在你的代码中有一个枚举,它可以把数字类别转换成更友好的应用程序代码,但是这样做会使你的代码更难维护。但是,它具有性能优势,因为运行查询时需要返回的字节更少。我会尽量避免这种情况,因为每次将类别添加到数据库时都需要更新应用程序代码。如果您真的需要从数据库中挤出性能,您可以选择整个category表,选择widgets表并将它们合并到应用程序代码中,但这是一种罕见的情况,因为DB客户机几乎总是与DB服务器有一个快速连接,而网络上多几个字节是无关紧要的 +1@jlafay,一个外键引用,就像这个答案一样,就是不要使用枚举;这只会混淆数据,使将来的更改或调试变得更加困难。例如,其中一个:考虑在枚举方案中,每次添加、删除或合并类别时都必须重写检查约束。问题要比类别表更新大得多。我相信当更改枚举类型时,枚举会有相当大的性能损失,因为它必须更改整个表。我建议OMG小马为灵活性和速度负责。