在数据库中存储类常量(用作位掩码)?

时间:2010-04-04 21:44:05

标签: php mysql database class constants

假设我有一个名为Medium的类,它可以代表不同类型的媒体。例如:

  • 上传视频
  • 嵌入式视频
  • 上传图片
  • 嵌入图片

我用这样的代表来代表这些类型:

class MediumAbstract
{
    const UPLOAD       = 0x0001;
    const EMBED        = 0x0010;
    const VIDEO        = 0x0100;
    const IMAGE        = 0x1000;

    const VIDEO_UPLOAD = 0x0101; // for convenience
    const VIDEO_EMBED  = 0x0110; // for convenience
    const IMAGE_UPLOAD = 0x1001; // for convenience
    const IMAGE_EMBED  = 0x1010; // for convenience

    const ALL          = 0x1111; // for convenience
}

因此,我很容易在(抽象)存储库上对它们进行组合搜索,例如:

{
    public function findAllByType( $type )
    {
        ...
    }
}

$media = $repo->findAllByType( MediumAbstract::VIDEO | MediumAbstract::IMAGE_UPLOAD );
// or
$media = $repo->findAllByType( MediumAbstract::ALL );
// etc..

您觉得在像数据库这样的具体存储库中使用这些常量值是什么感觉?好吗?或者我应该用数据库中有意义的数据替换它们。

Table medium:

| id |                type | location    | etc..
-------------------------------------------------
|  1 | use constants here? | /some/path  | etc..

(当然我只会使用有意义的常量:VIDEO_UPLOAD,VIDEO_EMBED,IMAGE_UPLOAD和IMAGE_EMBED)

1 个答案:

答案 0 :(得分:0)

在mySQL中,我会使用SET。它们使用最少量的数据存储在内部,但为您提供了值的预定义明文表示:

SET('UPLOAD','EMBED','VIDEO','IMAGE'); // costs 1 byte

Documentation on SET

您可以应用数据库查询:SELECT * FROM table WHERE type IN ("UPLOAD", "EMBED")

如果使用它,可能更容易使常量与字符串值匹配:

class MediumAbstract
{
    const UPLOAD       = "UPLOAD";
    const EMBED        = "EMBED";
    const VIDEO        = "VIDEO";
    const IMAGE        = "IMAGE";

(你现在正在做什么:0x0001无论如何都不是一个掩码,但是十六进制值,不是吗?更多here