2012-06-28 20 views
3

用戶配置文件。我有一些只有2或3個選項的屬性。例如,我將表格中的性別存儲爲tinyint(男= 1,女= 2)。所以在表中我有tinyint,但在前端我需要顯示字符串。我有大約4個屬性只有2個選項。關於屬性選項ID的小數據庫或php代碼?

所以,我有兩個選擇如何從選項顯示字符串:

創建額外的表,所有屬性選項將被保存。但在這種情況下,我需要爲每次額外加入時創建這樣一個小東西。

或者我可以在profile_helper.php中放入這類屬性的所有函數。例如

function getGender($optionId){ 
    $gender = $optionId == 1 ? "male" : "female"; 
    return $gender; 
} 

說到性能,是否值得爲這樣一個小事情額外加入?

+0

答案將取決於屬性可能改變的可能性。如果靜態的(性別)@nickb有意義,否則我建議的方式可能會更好地工作 –

+0

你的數據庫(以及哪個數據庫)和你的代碼中有兩雙鞋。大量的代碼不應該關心用戶是否以及如何存儲。 – hakre

回答

3

你可以使您的生活更輕鬆,ENUM所有的可能性,就像這樣:

`gender` ENUM('MALE', 'FEMALE') 

這樣一來,你從字面上插入值'MALE''FEMALE'到數據庫中,並當您從數據庫中檢索值時,您將返回其中一個字符串,並且唯一可能需要的幫助函數是ucfirst()strtolower()

我只會推薦這種方法用於不太可能改變的事物(其中性別是一個很好的例子)。

+0

我剛剛閱讀http://www.mysqlperformanceblog.com/2008/01/24/enum-fields-vs- VARCHAR-VS-INT-加盟表 - 什麼 - 是 - 快/。最後,作者得出結論「正如你所看到的,ENUM和VARCHAR結果幾乎相同,但連接查詢性能降低了30%。」所以如果是這樣的話,爲什麼我甚至會在這種情況下使用ENUM,爲什麼不簡單地放入varchar? – user1324762

+0

有很多原因。 1)該文章是在2008年編寫的,2)ENUM限制了可能性,VARCHAR將採取任何措施,以及3)我非常懷疑這會被認定爲應用程序的瓶頸。如果在分析和查詢優化之後,這被確定爲瓶頸,那麼您的應用程序必須非常高效,此時您可以直接轉換到VARCHAR而不會丟失列值。 4)ENUM很簡單(查看DB,誰知道(0,1)中哪一個對應於(男性,女性)) – nickb

0

我會defintely去SQL路線。未來可擴展性更強。很顯然,性別問題不是問題,而是取決於其他選擇可能會爲您節省一段時間。因此,像:

SELECT tblGender.gender FROM tblGender, tblUser WHERE tblUser.genderID = tblGender.genderID AND tblUser.userID = "x" 
+0

我認爲他雖然在談論一個屬性表,它將爲用戶存儲屬性,而不是針對性別的特定表 – Cfreak

0

我不是屬性表的粉絲。 SQL也不會優化。有些東西應該標準化到另一個表格。有些事情不應該。這真的取決於你的結構和你想要做的。

在性別的情況下,如果您正在構建一個多語言應用程序,它需要映射到您的語言工具,所以數據庫中的函數或常量或ENUMs對於任何數據都沒有問題,可能會改變。

0

嗯,這取決於。如果它是性別,它肯定不會增長 - 常數班是我會做的。

class Constants { 

    public static $gender = array(0 => 'male', 1 => 'female'); 

    public static function getGender($value) { 

     if (!empty(self::$gender[$value])) { 
      return self::$gender[$value]; 
     } 
    } 
} 

強大有用的,如果你要來封裝和做的,即:

echo Constants::getGender($user->gender); 

然而,如果你想要的值,你會經常變化,請走SQL的方式,因爲這是不好的硬編碼除非是「性別」問題。

恕我直言,沒有必要爲此加入,因爲性別永遠不會超過男性和女性。

乾杯

0

我想要第二張桌子。它的靈活,可擴展,易於更改或添加性別(即不指定)

SELECT person.id, gender.name 
FROM person 
INNER JOIN gender 
ON person.genderid = gender.id 

它仍然是非常高效的性能明智。這似乎很愚蠢,因爲現在只有兩個值,但這並不意味着你不應該遵循規範化規則。