【问题标题】:Use of MySql Data TypesMySql 数据类型的使用
【发布时间】:2011-03-18 17:42:44
【问题描述】:

以以下为例,我试图找出设置 MySql 数据库的最佳方法。

FoodGroupTypeCode: 谷物、蔬菜、水果、乳制品、蛋白质

表示该属性的最佳数据类型是什么?

  1. CHAR(1):G、V、F、D、P
  2. TINYINT:使用数字代码(即 Grain = 1,Vege = 2)
  3. ENUM
  4. VARCHAR(9):使用全名
  5. 其他(解释)

选项 4 真的不是我的考虑,除非有人真的可以验证它。我已经阅读了很多关于这个主题的“意见”,但正在寻找更具体的理由来选择一个而不是另一个。我很欣赏有人可以提供该程度的任何意见,而不是诸如“我喜欢 ENUM,因为它速度快”之类的意见。

【问题讨论】:

    标签: mysql database database-design types


    【解决方案1】:

    CHAR(1):G、V、F、D、P
    高性能、存储高效并产生可读的代码。当我知道这些值是稳定的,并且当我需要将行为附加到代码时,我喜欢这个解决方案。 (if code = 'G' then specific behaviour)。

    TINYINT:使用数字代码(即 Grain = 1,Vege = 2)
    高性能,存储效率高,但导致代码可读性降低。如果值发生变化,此解决方案也不会混淆(G 最初是 Grain,但现在已更改为 Brain)。这是最常见的。

    枚举
    除了微小的性能优势之外,我没有看到使用枚举的任何好处。 当然,如果您确实遇到了性能问题,那么小的性能提升是永远不够的。

    VARCHAR(9):使用全名
    结果是可读的代码。某些查询将具有较少的连接,在这些特定情况下会提供性能优势。存储效率不高,如果您想更改值,可能会给您带来问题。如果您有很多包含很多行的表,并且它们都在引用此表,请在冒险之前仔细考虑。

    【讨论】:

    • @Ronnis 感谢您浏览每一个。目前我在这些场景中使用 CHAR(1,2,3) 但有许多表反映了我的问题中表的格式。我很容易为所有内容保留一份备忘单,但想知道我是否采用了最好的方法,即使数据库本身中不存在这些定义。您是否看到使用 CHAR 的任何缩放问题?根据给定属性的定义数量或数据库中使用此格式的表数量进行缩放?
    • 您不妨将定义添加为参考表,因为迟早您将需要使用这些值填充组合框 :) 更重要的是,它可以帮助您加强数据的完整性。只要您不使用 CHAR(100) 之类的东西,我根本看不到使用 CHAR 的缩放问题。保持简短但有意义。
    • @Ronnis 感谢您的帮助。当您使用查找/参考表时,每组定义都有一个专用表吗?还是一张表可以处理整个数据库的所有定义?
    • 每人一个。记得对它们使用 pk/fk 约束。
    • @Ronnis 我想我理解了查找表是什么,但没有意识到它被称为查找表。通过进一步阅读,我相信我已经对此进行了建模。正确的? FoodGroupType 不是我的查找表吗? FoodGroupTypeCode 为 G、V、F、D、P,描述为 Grain、Vegative、Fruit、Dairy、Protein。每个都有一行。
    【解决方案2】:

    我会推荐 ENUM,因为它会将您可能的选择限制为谷物、蔬菜、水果、乳制品、蛋白质。

    但是,在数据库中,我通常将其作为带有检查约束的 VARCHAR(2)(只能是谷物、蔬菜、水果、乳制品或蛋白质),然后在我的应用程序中将其表示为 ENUM 或列表。

    【讨论】:

    • 但是你失去了描述
    • 虽然我想尽可能地保留数据库中的所有约束,但有多种方法可以为猫剥皮。以下是我遇到的一些针对 ENUM 的争论 SO ENUM Question,但我想与我的问题中的示例进行直接比较。
    【解决方案3】:

    适当的数据类型的选择完全取决于您将如何处理应用程序中的表数据(如果有),如果您使用此表仅用于存储记录,那么VARCHAR 将是一个更好的选择,因为它会使您的数据更加冗长,但是如果要对表数据进行处理,例如根据某些条件过滤结果,在应用程序逻辑中比较它们时,长名称可能会令人困惑,并且在这样的情况下在这种情况下,CHARTINYINT 会是更好的选择。虽然基于所用数据类型的性能影响应该是第二优先级。

    【讨论】:

      【解决方案4】:

      我会使用CREATE TABLE FoodGroupType (id int unsigned not null auto_increment PRIMARY KEY, code VARCHAR(20), description VARCHAR(100)。 所以食物表会看起来

      CREATE TABLE Food (id int unsigned not null auto_increment PRIMARY KEY, 
      food_group_type_id int unsigned not null, name VARCHAR(50), description VARCHAR(100),
      FOREIGN KEY(food_group_type_id) REFERENCES FoodGroupType(id) ON DELETE ... ON UPDATE ...
      

      【讨论】:

        【解决方案5】:

        我个人不会使用 Char(1) 或 tinyint,因为它们不是描述性的。从数据上看,它并没有想象的那么清楚。 Varchar 和 enum 将是我会考虑的两个。不过,我喜欢枚举的想法,因为它确实是这样。您是说所有食物都必须是这些食物类型中的一种。

        另外我听说枚举速度很快!

        【讨论】:

        • 数据库中保存的是描述性而不是选项 1 和 2 中的关系,这有多大的担忧?
        猜你喜欢
        • 2016-11-12
        • 2011-04-04
        • 2010-11-12
        • 2013-05-20
        • 1970-01-01
        • 1970-01-01
        • 2019-01-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多