2010-11-19 190 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