Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
需要关于mysql规范化和php类结构的建议吗_Php_Mysql_Database_Class Design_Normalization - Fatal编程技术网

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

需要关于mysql规范化和php类结构的建议吗,php,mysql,database,class-design,normalization,Php,Mysql,Database,Class Design,Normalization,我试图建立一个系统,日志,媒体(照片,视频,音频)上传统计。所以我想出了三张桌子,一张放音频,一张放视频,一张放照片。这是结构图 +-----------+---------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-----------+---------+------+-----+---------+-----------

我试图建立一个系统,日志,媒体(照片,视频,音频)上传统计。所以我想出了三张桌子,一张放音频,一张放视频,一张放照片。这是结构图

+-----------+---------+------+-----+---------+----------------+
| 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_名称作为参数。对更好的方法有什么建议吗??我真的很想改进我的代码,非常感谢

问候

更新

好的,根据大家的回答,我想澄清一些事情:

  • 我只需要记录上传的媒体
  • 我已经有了另一个单独的表来记录每个媒体的其他信息(长度、文件名、标题等)
  • 假设我添加了一个名为“media_id”的字段,并将该表合并为一个表,由于我添加和更新行的方式是基于日期的,如果找不到给定的日期和成员_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;
        }
    }
    
    你们觉得怎么样


    再次感谢

    将所有内容放在一个表中,并有一个媒体类型列

    +-----------+---------+------+-----+---------+----------------+
    | 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    |                |
    +-----------+---------+------+-----+---------+----------------+
    
    创建与定义媒体类型的另一个表的外键关系

    +-----------+---------+------+-----+---------+----------------+
    | Field        | Type | Null | Key | Default | Extra          |
    +-----------+---------+------+-----+---------+----------------+
    | media_type_id| int  | NO   | PRI | NULL    |                |
    | description  | text | NO   |     | NULL    |                |
     +-----------+---------+------+-----+---------+----------------+
    
    这将保存媒体类型id(如1)和媒体类型描述(如音频)。 e、 g


    然后,主表将在每一行上包含id 1、2、3,以表示它是哪种媒体类型。然后,您可以从应用程序中使用它,通过WHERE子句约束您所指的媒体。e、 g.从媒体类型id=3的主表中选择*以仅获取照片。

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

    要区分类型列不是一种好的设计方式。可能为每个表创建单独的类是好的,为什么不呢?这是3NF经常使用的功能。另一种方法是为每种不同的“类型”创建许多具有相同列结构的表。因此,如果稍后他想存储一些特定于媒体的信息,如视频长度或其他信息,您将如何捕获这些信息?是否为所有其他类型的日志设置NULL?这很糟糕,这取决于老年退休金计划更广泛的要求,这一点在问题中并不明确。这归结为对象关系阻抗不匹配()。答案总是“视情况而定”。OP可能只需要跟踪上传统计数据,而不关心特定于每种类型的数据。在这种情况下,上述建议可以。如果每种介质类型存储的数据不同,则最好使用单独的表。但在最初的问题中没有证据证明这一点。因此,我建议你接受它。除非他有一个非常严格的要求,否则我不想说我不认为这是一个糟糕的设计。为不同的领域概念使用一个表是一个糟糕的设计。一段时间后,如果他希望存储视频的长度。它在哪里合适?音频也有长度,所以同样有共性-也许它需要是一个空列,因为照片然而。所以把它放在同一张桌子上可能很有意义。然而,我们现在还不知道他的变更案例是什么,而且他的数据结构中似乎有足够多的共性,可以建议像这样合并它们。但它们确实是不同的领域概念。混合不同类型的实体,仅仅因为它们具有相同的基数,这真的很糟糕。你是否也更喜欢将男性和女性存储在不同的表格中,因为男性没有胸罩尺寸?最后,我只是在我的原始答案中添加了“可能”,这增加了必要的细微差别。对于“编辑”,根据您所述的要求(这只是记录上传),您上面所展示的似乎大部分都是好的。需要考虑的一件事是如何确定媒体id-您是将1,2,3作为照片、音频等存储在应用程序代码中的某个位置,还是在某个时候从媒体类型表中检索并稍后使用它们(我在想如果你以后添加另一种媒体类型会发生什么,等等)@Kris我会将媒体id信息存储在另一个表中
    1, audio
    2, video
    3, photo