Bir veritabanında (bit maskesi olarak kullanmak için) sınıfı sabitleri depolamak?

1 Cevap php

Diyelim ki farklı medya türlerini temsil edebilir Medium adında bir sınıf var diyelim. Örneğin:

  • Yüklenen Video
  • gömülü video
  • yüklenen görüntü
  • gömülü görüntü

Ben bu gibi CONTANTS ile bu tür temsil:

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
}

Benim gibi bir şey ile, bir (soyut) depo onlara bir birleşik arama yapmak için Böylece, bu kolaydır:

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

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

Nasıl bir veritabanı gibi somut bir depoda bu sabit değerlerini kullanarak hakkında ne düşünüyorsunuz? Tamam mı? Yoksa veritabanında anlamlı verilerle bunları değiştirmesi gerekir.

Table medium:

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

(Tabii ki, sadece anlamlı sabitleri kullanarak olacak: VIDEO_UPLOAD, VIDEO_EMBED, IMAGE_UPLOAD ve IMAGE_EMBED)

1 Cevap

MySQL, ben kullanmak istiyorum SET. Bunlar dahili veri az miktarda kullanarak saklanan, ama size değer önceden tanımlanmış bir açık metin temsilini vermek vardır:

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

Documentation on SET

Sen veritabanı sorguları uygulayabilirsiniz: SELECT * FROM table WHERE type IN ("UPLOAD", "EMBED")

Bunu kullanırsanız, muhtemelen sabitleri dize değerlerini maç yapmak daha kolay olacaktır:

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

(Şu anda ne yapıyoruz: 0x0001 Biraz zaten maske değil, bir onaltılık değer, öyle değil mi Daha here?)