首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在理论上很难使用MySQL的ENUM?

为什么在理论上很难使用MySQL的ENUM?
EN

Stack Overflow用户
提问于 2015-08-09 09:07:26
回答 1查看 181关注 0票数 1

学说与mySQL Enum,我读到:

Mysql Enum 原则2的类型系统由轻量组成,这意味着任何给定类型的实例都只有一个。此外,类型不包含状态。这两种假设使得使用Enum类型的MySQL变得相当复杂。

我喜欢用外行人的语言来解释它的含义。谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-09 11:00:56

原则2的类型系统由轻量组成,这意味着任何给定类型的实例都只有一个。

飞权类创建不可变的值对象。因此,在这种情况下,它们类似于String,

代码语言:javascript
复制
$String = "myString";

这将创建一个字符串对象,不能更改该对象。对此的任何更改都会导致一个新的String对象。飞权类的相似之处在于,一旦通过构造函数创建了一个新对象,它就不能被更改,并且它持有相同的值。然而,Fly权重类最终比仅仅使用String更容易消耗。

模式有一些很好的示例,它使用了一个更大的CoffeeShop实现中的富来登类CoffeeFlavour的几种语言中的示例。这里有一个应该是PHP的例子,我很快就模仿了这个例子:

代码语言:javascript
复制
<?php
class CoffeeFlavour {
  private $name;

  function __construct(String newFlavor) {
    $this->name = newFlavor;
  }

  public __toString() {
    return $this->name;
  }
}

因此,CoffeeFlavour的每个实例都是自己的CoffeeFlavour,用于订单等。

此外,类型不包含状态。

为了详细说明上面的内容:类似于字符串,Fly权重类不能更改实例。一旦它被建造,它就是这样的。因此,在上面的示例中,字符串"myString“就是这样的。字符串中的任何更改都会导致创建一个新对象。

以CoffeeFlavour为例,改变咖啡的味道是非常荒谬的!这就是为什么看不到setName()方法的原因。换言之,见以下内容:

代码语言:javascript
复制
$caffeineCoffee = new CoffeeFlavour("Caffeinated");
$decafCoffee = new CoffeeFlavour("Decaf");

你不可能说咖啡因的“状态”突然变成无咖啡因的。相反,你会创造一种新的独特的饮料。这就增加了它们的不可改变性。

当我点饮料时,我说:$myDrink = $caffeineCoffee;,因此引用羽毛重量类的对象。这些物体没有状态,它们只是,它们是什么。

另一方面,MySQL有一个列(类型),它有一个基于值列表的状态。因此,这直接与教条2的方法论相冲突。下文将作进一步阐述。

这两种假设使得使用Enum类型的MySQL变得相当复杂。

根据MySQL的文档https://dev.mysql.com/doc/refman/5.0/en/enum.html页面:

ENUM是一个字符串对象,其值是从表创建时列规范中显式枚举的允许值列表中选择的。

在这种情况下,MySQL列(类型)包含一个状态(它持有的是哪个允许的值)。这些值是在创建表时确定的,允许的值中的任何更改都需要对表进行删除和重构。但是,Fly权重类(如上面所示)很容易根据需要添加新实例。Flyweight类的每个类型(实例)都是唯一的,并且是不可变的。

因此,总结如下:

  • 轻量级类(如CoffeeFlavour)不会被覆盖,它们会根据需要添加额外的实例。
  • 这些实例永远不会改变状态。他们将永远是他们被创造时的样子。
  • Flyweight类的实例是几个没有状态的唯一对象,而不是一个包含多个可能状态的MySQL列。

希望这能回答你的问题!

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31902617

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档