php - 需要关于 mysql 规范化和 php 类结构的建议

标签 php mysql database class-design normalization

我正在尝试构建一个记录、媒体(照片、视频、音频)上传统计信息的系统。所以我想出了 3 个表,1 个用于音频,1 个用于视频,1 个用于照片。这是结构

+-----------+---------+------+-----+---------+----------------+
| 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    |                |
+-----------+---------+------+-----+---------+----------------+

所有三个表都有相同的字段,因为我认为(到目前为止)我需要区分每个特定表上的媒体,这是多余的吗??

无论如何,因为每个媒体都被同等对待,所以我认为我应该只构建一次类,并根据我当时正在访问的媒体使用这些方法。这是类(class):

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 个表格的方式,以及我使用 $table_name 作为参数的方式。对更好的方法有什么建议吗??我真的很想改进我的代码,非常感谢

问候

更新

好了,根据大家的回答,我想澄清一下:

  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;
    }
}

你们怎么看??

再次感谢

最佳答案

将它们全部放在一个表中并有一个 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 maintable WHERE media_type_id = 3 以获取照片。

关于php - 需要关于 mysql 规范化和 php 类结构的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4224797/

相关文章:

mysql - 当 mysql 数据库保存客户数据时,如何将更改部署到我的 drupal gear?

php - 我应该如何设计与服务器和数据库通信的软件

mongodb - 我应该选择什么 : MongoDB/Cassandra/Redis/CouchDB?

php - 具有多个不等于 where 子句的 Select 语句

php - 为什么我会收到 HTTP 400 错误请求错误?

python - 检查冲突/学生不能在同一类(class)中注册两次

java - 由于查询导致数据库插入错误

PHP fatal error : Uncaught Error: Call to a member function prepare() on null

php - 在 PHP 中使用 PDO 在 SQLite 和 MySQL 之间执行 JOIN?

php - mySQL 数据库查询 LIMIT 帮助...如果返回的行数超过 'x' 如何创建页面?