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

发布于 2024-10-03 12:33:31 字数 3896 浏览 4 评论 0原文

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

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

无论如何,由于每种媒体都受到相同的对待,所以我认为我应该只构建一次类,并根据我当时访问的媒体使用不同的方法。这是课程:

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

你们觉得怎么样?

再次感谢

i am trying to build a system that logs, media (photo, video, audio) upload statistic. so i come up with 3 tables, 1 for audio, 1 for video, and 1 for photo. and here's the structure

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

all three tables has the same fields, since i think (so far) i need to differentiate the medias on each and particular table, is this redundant ??

anyway since each of the media is treated the same, so i think i should only build once class and kinda use the methods depending of what media i am accessing at the time. here's the 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;
            }
        }

  }

so far this is pretty much working but, i still have doubts on the way i break the table in to 3 tables, and the way i use the $table_name as parameter. any suggestions for better approach ?? i really want to improve my codes, thank you very much

Regards

UPDATE

alright, based on everybody's answer, i would like to clear somethings up:

  1. i only need to log the uploaded media
  2. i already have another separate table to record other information (length, filename, titles, etc) for each media.

lets just say i add a field called "media_id" and merge the table into one, and since the way that i add and update my rows is based on the day-date, it will INSERT if the given daydate and the member_id is not found, and otherwise it will UPDATE, i think i should also change the way my add_log() method works, into something like:

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

what do you guys think ??

thanks again

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

瞎闹 2024-10-10 12:33:31

将它们全部放在一张表中并有一个 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 即可获取照片。

Put it all in one table and have a media_type column.

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

Create a foreign key relationship to another table that defines media_type.

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

This would hold media_type_id (e.g. 1) and media_type_description (e.g. audio).
e.g.

1, audio
2, video
3, photo

The main table would then just include on each row the id of 1, 2, 3 to denote which media type it is. You can then use this from your application to constrain via the WHERE clause, which media you're referring to. e.g. SELECT * FROM maintable WHERE media_type_id = 3 to just get the photos.

风筝有风,海豚有海 2024-10-10 12:33:31

使其成为一个带有额外列“media_type”的表。您的设计需要为每种新媒体类型制作一个额外的表,这可能是糟糕的设计。

Make it one table with an extra column "media_type". Your design would require you to make an extra table for every new media type and that is possibly poor design.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文