Хранение констант класса (для использования в качестве битовой маски) в базе данных? - PullRequest
1 голос
/ 05 апреля 2010

Допустим, у меня есть класс с именем 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 голосов
/ 05 апреля 2010

В 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 в любом случае это не битовая маска, а шестнадцатеричное значение, не так ли? Подробнее здесь )

...