【问题标题】:Storing class constants (for use as bitmask) in a database?在数据库中存储类常量(用作位掩码)?
【发布时间】:2011-02-04 06:47:18
【问题描述】:

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

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

我用 contants 表示这些类型,如下所示:

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)

【问题讨论】:

  • 不是真正的社区 wiki 问题 IMO。
  • +1 佩卡。社区维基让我不回答。我喜欢因回答问题而获得声誉积分。
  • 我在问一个主观的(你感觉如何......)问题。但我会取消它的维基百科……看看社区对它的看法。 :)
  • ... 这似乎不可能。 :( 或者我在这里遗漏了什么?

标签: php mysql database class constants


【解决方案1】:

在 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

【讨论】:

  • 您好 Pekka,感谢您的回答。很好,你提到了 mysql,因为这是我选择的数据库。所以我添加了标签。我相信十六进制表示仍然被认为是位掩码,因为它仍然允许对它们进行按位操作(虽然不完全确定)。十六进制值只是更清楚地说明了这些值。也请参阅stackoverflow.com/questions/243712/why-use-hex。您的解决方案是合理的,但不允许对它们进行按位运算。而且我喜欢使用按位运算。这就是我问这个问题的原因。
猜你喜欢
  • 2023-03-15
  • 2013-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多