нужен совет по нормализации mysql и структуре класса php - PullRequest
3 голосов
/ 19 ноября 2010

Я пытаюсь построить систему, которая регистрирует, загружает медиа (фото, видео, аудио) статистику. поэтому я придумываю 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 в качестве параметра. какие-либо предложения для лучшего подхода? я действительно хочу улучшить свои коды, большое спасибо

Привет

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

что вы, ребята, думаете ??

еще раз спасибо

Ответы [ 2 ]

2 голосов
/ 19 ноября 2010

Сделать это одной таблицей с дополнительным столбцом "media_type".Ваш дизайн потребует от вас создания дополнительной таблицы для каждого нового типа носителя, а это возможно плохой дизайн.

2 голосов
/ 19 ноября 2010

Поместите все это в одну таблицу и получите столбец 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, чтобы указать, какой это тип носителя. Затем вы можете использовать это из своего приложения, чтобы ограничить с помощью предложения WHERE, на какой носитель вы ссылаетесь. например SELECT * FROM maintable WHERE media_type_id = 3, чтобы просто получить фотографии.

...