假设我有一个名为 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
您可以应用数据库查询: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/