在MySQL数据库中保存对象及其类型的最佳方法

时间:2018-01-12 09:32:35

标签: mysql oop database-design relational-database

使用面向对象的编程语言我遇到的情况是我有一个Object,其中一个属性是对象的类型。当我将它保存到数据库时,我总是创建两个表,一个用于对象本身,另一个用于对象类型(id,name)。然后我将typeId分配给对象并创建ObjectType表的外键。我不确定这是否正确,因为:

  • 我使用整个表只保存少量记录(5-10种可能的对象类型)并且很少更新。
  • 我需要在两个表之间进行JOIN以显示对象类型的名称。
  • 在代码中我声明了与类型表中具有相同ID的常量(在编程和将类型分配给对象时进行操作),我不喜欢这种冗余。

另一个选项是使用一个字符串并将其直接保存在对象的表中,但这听起来不太好,因为搜索速度比使用typeId慢,并且没有关于所有可能类型的列表。更改一种类型的名称也更复杂。你能告诉我在这种情况下最好的做法是什么吗?

1 个答案:

答案 0 :(得分:1)

在这种情况下,您有3个选项:

  1. 的Varchar
  2. Enum Fields
  3. 另一个已加入的表(查找表)。
  4. 您有5个评估参数:

    1. 冗余
    2. 可扩
    3. 可修改
    4. 性能
    5. 简单
    6. Varchar

      1. 非常糟糕(您应该复制值)
      2. 好(您可以轻松添加新类型)
      3. 非常糟糕(您应该使用相同的值更改所有插入的数据)
      4. 优秀(基于参考)
      5. 优秀(易于在其他领域和ORM中使用)
      6. 枚举字段:

        1. 好(DBMS控制冗余)
        2. 非常非常糟糕(基于参考)
        3. 非常非常糟糕(基于参考)
        4. 优秀(基于参考)
        5. 非常好(有些ORM表现为字符串字段 - 请参阅this reference
        6. 其他已加入的表格(查找表格)

          1. 优秀(ER常规方法)
          2. 优秀(ER常规方法)
          3. 优秀(ER常规方法)
          4. 正常(可能不好 - 如果速度如此重要)
          5. 正常(取决于程序员)
          6. 参考

            请参阅此处的效果分析(Enum Fields VS Varchar VS Int + Joined table: What is Faster?)。

            在此处查看Enum的优缺点(8 Reasons Why MySQL's ENUM Data Type Is Evil)。

            请参阅SO中的查找表和mysql here中的Varchar示例。

            最后:根据您的评估参数,您可以选择正确的选项。

            另一种可能性是在数据库中仅使用整数编号并管理源代码中的所有内容。我没有把它放在评估中,因为它不是数据库设计。这是编程方法。