Помогите со структурой таблицы

Тема в разделе "Базы данных", создана пользователем vitek_gagra, 11 фев 2013.

Модераторы: latteo
  1. vitek_gagra

    vitek_gagra Создатель

    Регистр.:
    7 янв 2009
    Сообщения:
    47
    Симпатии:
    12
    Здравствуйте уважаемые форумчане.

    На сайте доски объявлений решил сделать, что бы пользователи могли добавить понравившееся объявление в избранное (блокнот) на каком сайте как называется :)
    Подскажите какую лучше структуру у таблицы сделать.

    Объявления находятся в разных таблицах
    Авто объявления - a_messages
    Авто запчасти - spare_parts
    Остальные объявления - messages
    У каждого объявления есть свой айди.

    Хочу сделать таблицу favorites и в нее записывать айди объявления, айди пользователя.
    Какую лучше сделать структуру таблицы просто айди объявления, айди пользователя или еще название объявления?
    Просто хотелось что бы не сильно нагружало движок, а то он и так нагруженный.

    И еще такой вопрос, что бы не создавать отдельную тему, спрошу здесь.
    Последние комментарии объявлений.
    Комментарии объявлений находятся тоже в разных таблицах.
    К авто объявлениям auto_comments и остальные объявления obj_comments
    Щас вывожу вот так
    Код:
    while ($b = query_rw ("SELECT a.`cid`, a.`hid`, a.`usr_login`, a.`usr_mess`, c.`marka_id` AS `mess_id`, c.`full_name` AS `full_name` FROM `auto_comments` AS a LEFT JOIN `a_messages` AS c ON (c.`mess_id` = a.`hid`) WHERE a.`active` = 1 ORDER BY a.`add_date` DESC LIMIT 3")) {
            $w = DIR_ROOT.'img/'.$b['usr_login'].'.jpg';
            $w2 = DIR_ROOT.'img/'.$b['usr_login'].'.gif';
            if (file_exists ($w2)) $f = 'http://'.SITE_HOST.'/img/'.$b['usr_login'].'.gif'; elseif (file_exists ($w)) $f = 'http://'.SITE_HOST.'/img/'.$b['usr_login'].'.jpg'; else $f = 'http://'.SITE_HOST.'/images/v2/default.png';
            
            $a[] = array (
                'id' => $b['cid'],
                'name' => $b['full_name'],
                'url' => 'http://'.SITE_HOST.'/transport/uniq/'.$b['hid'].'/',
                'user' => $b['usr_login'],
                'user_url' => 'http://'.SITE_HOST.'/user/'.$b['usr_login'].'/',
                'text' => $b['usr_mess'],
                'avatar' => $f
            );
        }
    и потом так же к остальным объявлениям.
    Вопрос такой, как сделать что бы они вместе выводились
     
  2. ВладимирТрой

    ВладимирТрой Постоялец

    Регистр.:
    29 янв 2013
    Сообщения:
    53
    Симпатии:
    19
    по любому если будешь добавлять отдельную таблицу где будут храниться id из разных таблиц и id пользователя тебе еще нужно добавить какой-нибудь селектор по сущности (по типу) чтобы не было пересечений (к примеру добавится запись с id из таблицы a_messages, а в таблице spare_parts, например, уже будет такой же id и при выборке/проверке будет и то и то объявление в избранном)
    на счет добавления названия в избранное - это смотря какой функционал будет, к примеру если будет поиск по избранному - то в качестве оптимизации можно что-то дополнительно хранить, а так думаю не стоит чересчур усложнять (т.к. после изменения названия объявления надо будет менять и название в избранном)
     
  3. vitek_gagra

    vitek_gagra Создатель

    Регистр.:
    7 янв 2009
    Сообщения:
    47
    Симпатии:
    12
    Да, вообще то на счет переименования ты прав. На странице избранных объявлений будет показываться название и оно же ссылка на объявление, без всяких наворотов типо сравнений объявлений и всякого такого, возможно потом будет, но сейчас простое надо.
    Я просто подумал если потом брать название по айди из таблицы с объявлениями, не будет нагружать лишним запросом?!
    Тогда получается надо структуру делать айди объявления, тип объявления, айди пользователя
    Это будет более оптимальный вариант или есть еще какие то предложения?
     
  4. ВладимирТрой

    ВладимирТрой Постоялец

    Регистр.:
    29 янв 2013
    Сообщения:
    53
    Симпатии:
    19
    нет, запросы по id (а id - это получается первичный индекс в таблице) нагружать сильно не будут, мне кажется это самый оптимальный метод решения (+ еще конечно проиндексировать поля в этой таблице)

    на счет второго вопроса, как объединить получение комментариев - используй union для этого (т.е. несколько запросов объединенных через union)

    ну что-то вроде
    Код:
    (SELECT [fields] FROM `auto_comments` [...]) union (SELECT [fields] FROM `obj_comments` [...])
    это получит все комментарии одним списком из обеих таблиц
    только надо чтобы поля [fields], их названия и соответственно обе выборки были одинаковы, т.е. если будет если они по-разному называются надо приводить к одному названию через alias - [field] as [fieldname]

    или имелось в виду получить одним запросом и записи и комментарии к ним? если да - то так в принципе можно через join, но так лучше не делать, а получать отдельно комментарии и отдельно объявления (чтобы не нагружать сервер)
     
    vitek_gagra нравится это.
  5. Андрей Шпак

    Андрей Шпак Создатель

    Регистр.:
    11 фев 2013
    Сообщения:
    43
    Симпатии:
    7
    А есть ли смысл делить талицы? Может лучше одна - просто поле "Тип объявления" вставить и индекс по нему тоже? А дележ начинать уж по другим признакам - актуальность там, или архивные - и выносить их в другую таблицу(цы) - там [messages_arch2011]?

    Кстати- такой расклад и второй вопрос хорошо решает - вывод вместе, поиск и тд.