我想知道我遇到的基本数据库设计/数据类型问题。
我有一个带有名为“experience_required”字段的porjects表。我知道这个领域将总是来自以下选项之一:实习生,初级,高级或导演。随着时间的推移,这个列表可能会有所不同,但我不希望它上面的项目发生重大变化。
我应该选择整数还是字符串?将来当我有大量像这样的记录并需要通过expeirence_required检索它们时,它们会以整数形式存在差异吗?
答案 0 :(得分:2)
绝对选择Integer over String。
性能会更好,您的数据库将更接近标准化。
最终,您应该创建一个名为ExperienceLevel的新表,其中包含字段Id和Title。现有表中的experience_required字段应更改为另一个表上的外键。
这将是一个更强大的设计,如果您更改可用的体验级别或决定重命名体验级别,将会更加宽容。
您可以阅读有关规范化here的更多信息。
答案 1 :(得分:2)
您可能希望此字段已编入索引。一旦索引整数和小字符串没有太多(读取可忽略的)性能差异。
答案 2 :(得分:1)
整数。字符串应该只用于存储文本数据(名称,地址,文本等)。
此外,在这种情况下,整数更适合排序,存储空间和维护。
答案 3 :(得分:1)
理论上,整数在索引时会占用较少的内存。 您也可以使用枚举(在mysql中),它看起来像字符串但存储为整数。
答案 4 :(得分:1)
没关系。差异可以忽略不计。有什么区别会有利于整数的选择,但这是我喜欢短文本密钥的少数情况之一,因为它会在许多报告情况下将JOIN保存回查找表。
答案 5 :(得分:0)
为了使水变得混乱,我建议混合使用。从@ GregSansom的想法(upvoted)开始,但是使用CHAR(1)
数据类型而不是整数,使用值I,J,S和D.这将提供与使用tinyint相同的性能,并提供额外的优势当(如果)直接处理数据时,一个简单的记忆助记符。稍微用一点就可以记住,“S”意味着“高级”,而3则没有任何内置意义 - 特别是如果按照你的建议,随着时间的推移增加额外的值。 (将Probationary添加为5,并且“低等级=低值”范例不在窗口。)
这仅适用于您有非常短的项目列表。获得太多或太相似,并且很难处理可用的代码。
当然,如果这些是连续值怎么办?当然听起来像这里。在这种情况下,不要将它们设为1,2,3,4,将它们设为10,20,30,40,这样您以后就可以插入新的分类。这也可以让您轻松实现范围,例如“everyone< 30”(意思是小于“高级”)。
我想我的主要观点是:了解您的数据,如何使用,随时间变化的方式或方式,以及相应的计划和编码!