我正在嘗試構建一個記錄,媒體(照片,視頻,音頻)上傳統計的系統。所以我想出3張桌子,1個音頻,1個視頻和1個照片。而這裏的結構需要關於mysql規範化和php類結構的建議
+-----------+---------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+---------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| member_id | int(10) | NO | | NULL | |
| counter | int(11) | NO | | NULL | |
| daydate | text | NO | | NULL | |
| epochtime | text | NO | | NULL | |
+-----------+---------+------+-----+---------+----------------+
所有三個表具有相同的字段,因爲我想(到目前爲止)我需要區分每個和特定表的媒體,這是多餘的?
無論如何,因爲每個媒體都被視爲相同,所以我認爲我應該只建立一個類,並根據我在當時訪問的媒體使用方法。這裏的類:
require_once(INC_PATH.DS.'database.php');
class Log extends DatabaseObject {
protected static $db_fields = array('id', 'member_id', 'counter', 'daydate', 'epochtime');
public $id;
public $member_id;
public $counter;
public $daydate;
public $epochtime;
public function find_counter($table_name){
global $database;
$time = date('d-m-Y');
$timestamp = time();
$sql = "SELECT * FROM ". $table_name;
$sql .= " WHERE daydate = '".$this->daydate."'";
$sql .= " AND member_id = '".$this->member_id."'";
return self::find_by_sql($sql);
}
public function add_log($table_name){
global $database;
$tes = $this->find_counter();
if(!empty($tes)){
$sql = "UPDATE ".$table_name;
$sql .= " SET counter = counter+1";
$sql .= " WHERE daydate = '".$this->daydate."'";
$sql .= " AND member_id = '".$this->member_id."'";
$database->query($sql);
return ($database->affected_rows() == 1) ? true : false;
}else{
$sql = "INSERT INTO ".$table_name;
$sql .= " (id, member_id, user_privelege, counter, daydate, epochtime)";
$sql .= " VALUES ('', '".$this->member_id."'";
$sql .= " , '".$this->user_privelege."', '1', '".$this->daydate."', '".$this->epochtime;
$sql .= "')";
$database->query($sql);
return ($database->affected_rows() == 1) ? true : false;
}
}
}
到目前爲止,這是相當多的工作,但我仍然對我破錶中,以3代表的方式,我用的是$表名作爲參數的方式表示懷疑。任何建議更好的方法?我真的想提高我的代碼,非常感謝你
問候
UPDATE
好吧,根據每個人的答案,我想有些事情澄清:
- 我只需要登錄上傳的媒體
- 我已經有另一個單獨的表來記錄每個媒體的其他信息(長度,文件名,標題等)。
讓我們只是說我添加一個名爲「media_id」的字段並將表合併成一個,因爲我添加和更新我的行的方式是基於日期日期,所以如果給定的日期而member_id沒有找到,否則它會更新,我想我也應該改變我的add_log()方法的工作,一路到類似:
public function add_log($table_name, $media_id){
global $database;
$tes = $this->find_counter();
if(!empty($tes)){
$sql = "UPDATE ".$table_name;
$sql .= " SET counter = counter+1";
$sql .= " WHERE daydate = '".$this->daydate."'";
$sql .= " AND member_id = '".$this->member_id."'";
$sql .= " AND media_id = '".$media_id."'";
$database->query($sql);
return ($database->affected_rows() == 1) ? true : false;
}else{
$sql = "INSERT INTO ".$table_name;
$sql .= " (id, member_id, media_id, counter, daydate, epochtime)";
$sql .= " VALUES ('', '".$this->member_id."'";
$sql .= " , '".$media_id."', '1', '".$this->daydate."', '".$this->epochtime;
$sql .= "')";
$database->query($sql);
return ($database->affected_rows() == 1) ? true : false;
}
}
你們覺得是什麼?
再次感謝
對於'編輯',根據您所陳述的要求(這只是記錄上傳),上面顯示的內容似乎大多是好的。有一點需要考慮的是如何確定media_id - 你是否將1,2,3作爲照片,音頻等存儲在某處的應用程序代碼中,或者是否在某處從media_type表中檢索它們並使用他們後來(我想如果你以後添加其他媒體類型會發生什麼,等等) – 2010-11-19 12:48:27
@Kris我會將media_id信息存儲在另一個表 – littlechad 2010-11-20 04:06:37