我正在尝试构建一个记录,媒体(照片,视频,音频)上传统计的系统。所以我想出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