Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL表中存储分类引用的最佳方法是什么?_Sql_Mysql_Database Design_Enums_Statistics - Fatal编程技术网

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

在SQL表中存储分类引用的最佳方法是什么?,sql,mysql,database-design,enums,statistics,Sql,Mysql,Database Design,Enums,Statistics,我想在MySQL数据库表中存储大量的分类数据。比如说,我想查看有关小部件的信息,并想以某种方式对属性进行分类,即形状类别 例如,小部件可以分为:圆形、方形、三角形、球形等。 这些类别是否应该存储在表中,以便从应用程序中最好地引用它们?我可以想象,另一种可能性是,在小部件中添加一列,其中包含一个包含微小int的shape列。这样,我的应用程序就可以通过该列搜索形状,然后使用一个协调枚举类型来映射shape int的含义 哪一个最好?或者还有其他我还没有想到的解决方案吗?我认为最好的方法是使用枚举,

我想在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小马为灵活性和速度负责。