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

标签 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)

最佳答案

在 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 )

关于php - 在数据库中存储类常量(用作位掩码)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2576006/

相关文章:

php - 在 WordPress 插件中从 PHP 代码写入 UTF-8 JSON 文件

php - PDOException SQLSTATE[HY093] : yii-2 where and between Query

php - PHP 中的 Facebook Insights 访问

javascript - 使用 Node.js 将数据库查询发送到网站

mysql - 如何在 MySQL 中为每个用户选择最多 3 个项目?

php - Satis - 在本地存储 Packagist 存储库,并进行本地更改,但不供公众使用

MySQL 建模 : Relationship normalization & ring issue

mysql - SELECT COUNT(*) 基于连接表条件

java - SQLite - 没有这样的表 : while using CTE for deleting duplicate records

node.js - MongoDB 使用 Node.js 获取集合中的文档数(计数)