2010-04-04 135 views
1

假設我有一個名爲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)

+1

不是一個真正的社區wiki問題國際海事組織。 – 2010-04-04 21:58:21

+0

+1 Pekka。社區維基讓我無法回答。我喜歡獲得聲譽積分來回答問題。 – 2010-04-04 22:03:31

+0

我有點問一個主觀(你覺得...)的問題。但我會對它進行修改......並瞭解社區對此的看法。 :) – 2010-04-04 22:06:26

回答

0

在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"; 

(你在做什麼ng現在:0x0001無論如何不是一個位掩碼,而是一個十六進制值,不是嗎?更多here

+2

嗨Pekka,謝謝你的回答。好,你提到了mysql,因爲這是我選擇的DB,所以我添加了標記,我相信十六進制表示仍然被認爲是掩碼仍然允許對它們進行按位運算(儘管如此,還不完全確定)。十六進制值只是說明了這些值更清楚。關於這一點,請參閱http://stackoverflow.com/questions/243712/why-use-hex。您的解決方案非常完善,但不允許對它們進行按位操作,而且我喜歡使用按位操作,這就是爲什麼我問這個問題的原因。 – 2010-04-04 22:18:05