2010-11-19 76 views
3

我正在嘗試構建一個記錄,媒體(照片,視頻,音頻)上傳統計的系統。所以我想出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

好吧,根據每個人的答案,我想有些事情澄清:

  1. 我只需要登錄上傳的媒體
  2. 我已經有另一個單獨的表來記錄每個媒體的其他信息(長度,文件名,標題等)。

讓我們只是說我添加一個名爲「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; 
    } 
} 

你們覺得是什麼?

再次感謝

+0

對於'編輯',根據您所陳述的要求(這只是記錄上傳),上面顯示的內容似乎大多是好的。有一點需要考慮的是如何確定media_id - 你是否將1,2,3作爲照片,音頻等存儲在某處的應用程序代碼中,或者是否在某處從media_type表中檢索它們並使用他們後來(我想如果你以後添加其他媒體類型會發生什麼,等等) – 2010-11-19 12:48:27

+0

@Kris我會將media_id信息存儲在另一個表 – littlechad 2010-11-20 04:06:37

回答

2

把它放在一個表中,並有一個media_type列。

+-----------+---------+------+-----+---------+----------------+ 
| 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 |    | 
| media_type| int  | NO |  | NULL |    | 
+-----------+---------+------+-----+---------+----------------+ 

創建一個外鍵關係到另一個定義media_type的表。

+-----------+---------+------+-----+---------+----------------+ 
| Field  | Type | Null | Key | Default | Extra   | 
+-----------+---------+------+-----+---------+----------------+ 
| media_type_id| int | NO | PRI | NULL |    | 
| description | text | NO |  | NULL |    | 
+-----------+---------+------+-----+---------+----------------+ 

這將保持media_type_id(例如1)和media_type_description(例如音頻)。 例如

1, audio 
2, video 
3, photo 

然後,主表將在每行上包含1,2,3的id以表示它是哪種媒體類型。然後,您可以在應用程序中使用此命令,通過WHERE子句來限制所指的媒體。例如SELECT * FROM維護者WHERE media_type_id = 3以獲取照片。

+0

有一個類型列來區分不是一個好的設計方式。可能會爲每個表創建單獨的課程很好 – vinothkr 2010-11-19 12:13:43

+0

爲什麼不能?這是3NF常用的功能。另一種方法是爲每個不同的「類型」創建具有相同列結構的許多表。 – 2010-11-19 12:18:54

+0

所以如果以後他想存儲一些媒體特定的信息,比如視頻的長度或者什麼,你會如何捕獲這些信息?爲所有其他類型的日誌放置NULL?那很差 – vinothkr 2010-11-19 12:20:22

2

使它成爲一個具有額外列「media_type」的表格。您的設計需要您爲每種新媒體類型製作一張額外的桌子,這可能是可能糟糕的設計。

+0

我不認爲這是一個糟糕的設計。針對不同領域概念使用單個表是一個糟糕的設計。一段時間後,如果他希望存儲視頻的長度。它在哪裏適合? – vinothkr 2010-11-19 12:14:55

+0

音頻也有長度,所以再次有共同性 - 也許它需要是一個空列,但因爲照片。所以將它保存在同一張表中可能很有意義。但是,我們現在不知道他的變化情況如何,看起來他的數據結構中有足夠的通用性來推薦像這樣合併它們。 – 2010-11-19 12:20:36

+0

但他們是真正不同的領域概念。僅僅因爲它們具有相同的基數而混合不同種類的實體是非常不利的 – vinothkr 2010-11-19 12:22:41