嗯,這是一個簡單的設計問題,我想了很多次,從來沒有找到一個令人滿意的解決方案。我的例子是用php-sql,但是這當然也適用於其他語言。數據庫設計:將sql數據庫鍵匹配到php常量中?
我有一個小的數據庫表,只包含很少的條目,而且幾乎從不需要更新。如該usertype
表:
usertype_id (primary key) | name | description
---------------------------+------------+-------------------
1 | 'admin' | 'Administrator'
2 | 'reguser' | 'Registered user'
3 | 'guest' | 'Guest'
在PHP代碼
現在,我經常要檢查或比較我負責的用戶類型。由於用戶類型存儲在數據庫中,因此我可以:
1)從類實例化處的usertype表中選擇*,並將其存儲在數組中。
然後所有的ID都可用於代碼,我可以做一個簡單的選擇來獲得我需要的行。每次實例化該類時,該解決方案都需要一個數組和一個數據庫查詢。
$query = "SELECT info, foo FROM user WHERE usertype_id = ".$usertypes['admin'];
2)使用name
列選擇正確的usertype_id
,所以我們可以與其他表有效連接。這是爲了1或多或少當量),但無需緩存整個用戶類型表在php對象:
$query = "SELECT info, foo FROM user JOIN usertype USING (usertype_id) WHERE usertype.name = 'admin' ";
3)定義在用戶類型表匹配的按鍵時常量:
// As defines
define("USERTYPE_ADMIN",1);
define("USERTYPE_REGUSER",2);
//Or as class constants
const USERTYPE_ADMIN = 1;
const USERTYPE_REGUSER = 2;
然後做一個簡單的選擇。
$query = "SELECT info, foo FROM user WHERE usertype_id = " . USERTYPE_ADMIN;
這可能是資源最有效的解決方案,但它是壞的保持,因爲你如果需要修改的用戶類型桌上的東西同時更新表和代碼..
4)廢棄usertype
表,只保留php代碼中的類型。我不太喜歡這個,因爲它允許任何值進入數據庫並分配給用戶類型。但也許,所有的事情都考慮到了,它並沒有那麼糟糕,我只是讓一些簡單的事情變得複雜起來。
總而言之,總結一下我最喜歡的解決方案是#2,因爲它是連貫的,索引usertype.name
,它不能那麼糟糕。但是我經常最終使用#3來提高效率。
你會怎麼做?有更好的解決方案
(編輯:在#2固定查詢)
這將工作,如果類型的表將是由只有一個表中使用(如示例)。但是如果多個表需要使用相同的枚舉類型呢? – Vincent 2010-08-19 15:46:37
那麼,你需要使用規範化的方法。然後你不停地查詢數據庫的值。要麼,要麼保持在兩個地方(這是不好玩的)...... – ircmaxell 2010-08-19 15:53:27