Проектирование моей базы данных MySQL для оценки вещей в разные дни - PullRequest
0 голосов
/ 07 июля 2011

Я недавно использовал reddit в качестве моей помощи, и они были великолепны, но потом я нашел этот сайт и чувствую, что это гораздо более подходящее место, чтобы задавать мои вопросы.Надеемся, что тенденция полезности продолжается здесь.Позвольте мне начать с того, что я знаю, что этот проект довольно интенсивный, учитывая, что я никогда не делал ничего подобного раньше, однако это не меняет того факта, что я делаю это, и я готов научиться тому, как.

IЯ разрабатываю веб-сайт, на котором будут представлены специальные предложения бара и ресторана для моего города.Пользователи смогут войти в систему, и на главной странице отобразятся 5 самых популярных рейтинговых бар / счастливых часов и 5 лучших обеденных / счастливых часов для этого дня (т.е. понедельник, вторник и т. Д.).Каждое «специальное предложение» будет иметь повышающий рейтинг, чтобы пользователь мог внести свой вклад в специальное предложение.

На странице баров будут перечислены все бары и их специальные предложения на этот день, а также возможность повышения или понижения.специальный.То же самое с обеденной страницей.Оттуда человек может нажать на название панели, чтобы перейти на страницу, посвященную этой панели.На этой странице будут показаны специальные предложения на всю неделю.

Я сейчас нахожусь в процессе разработки таблицы MySQL в phpmyadmin, так как мне кажется, что именно здесь мне нужно начать после написания html и css длядизайн.Я пробовал поискать в Интернете систему, из которой я мог бы построить, однако я не нашел ничего подходящего.

Было бы лучше сделать отдельные таблицы под каждой базой данных для каждого дня недели, поместить все в одну таблицу или каким-либо другим способом.Это то, что я сделал до сих пор, дайте мне знать, на правильном ли я пути или нет.Бесконечно благодарен!! (http://dl.dropbox.com/u/16887445/Screen%20shot%202011-07-06%20at%208.01.10%20PM.png)

Ответы [ 2 ]

1 голос
/ 07 июля 2011

День недели является атрибутом «особой» записи, а не самой записью.Представьте себе это - если у вас есть одна таблица в день, и вы хотите получать все специальные предложения для одного бара на неделю, вам нужно будет выполнить семь запросов:

SELECT * FROM sunday_specials WHERE
  establishment_id = <id> and date = <sunday>;

SELECT * FROM monday_specials WHERE
  establishment_id = <id> and date = <monday>;

SELECT * FROM tuesday_specials WHERE
  establishment_id = <id> and date = <tuesday>;
...

Это (надеюсь) очевидноплохой дизайн.Все, что вы хотите, это сделать это с помощью одного запроса:

SELECT * FROM specials WHERE
  establishment_id = <id> and date >= <sunday> and date <= <saturday>;

Обратите внимание, что вы даже не заботитесь о сохранении дня недели, все, что вам нужно, это дата (котораявам все равно нужно), из которого вы можете извлечь день недели.Я бы создал схему примерно так:

-- This holds one record for each bar/restaurant.
CREATE TABLE establishments
(
    id INT SERIAL,
    name TEXT NOT NULL,
    address TEXT,
    phone TEXT,
    uri TEXT,
    type INT NOT NULL DEFAULT 1,
    PRIMARY KEY (id)
);

-- This holds one record per day per establishment. Not storing the
-- day of the week allows you to keep all records going back in time.
-- Up/Down voting simply increments or decrements the rating field.
CREATE TABLE specials
(
    id INT SERIAL,
    establishment_id INT NOT NULL REFERENCES establishments(id),
    special_date DATE NOT NULL DEFAULT NOW()::DATE,
    name TEXT NOT NULL,
    description NOT NULL,
    rating INT NOT NULL DEFAULT 0,
    PRIMARY KEY (id)
);

Итак, чтобы отобразить спецпредложения для "Моего бара", вы сделаете что-то вроде:

$start_date = <whenever>
$end_date = <whenever>
$id = SELECT id FROM establishments WHERE name = 'My Bar';
$specials = SELECT * FROM specials WHERE
    id = $id AND special_date >= $start_date AND special_date <= $end_date;

Для отображения пяти лучшихНоминальные скидки на понедельник:

SELECT * FROM specials WHERE special_date = <monday> ORDER BY rating DESC LIMIT 5;
0 голосов
/ 07 июля 2011

Если я правильно понимаю, к чему вы клоните, вероятно, я бы спроектировал схему так:

TABLE location // For storing details about the bars & restaurants
location_id (pkey)
location_name
location_type // For flagging if it's a restaurant, bar, other, etc.
location_address
...

TABLE specials // Holds all the specials for all days of the week
specials_id (pkey)
location_id (fkey)
day_of_week // 1-7 values
special_name
special_detail
...

TABLE votes
vote_id (pkey)
specials_id (fkey)
vote_type // Flag for up/down (1, -1)
...

Как только вы нормализуете данные, вы можете использовать запросы или представления для извлеченияагрегированные данные.Например, чтобы найти все голоса «за», вы можете использовать такой запрос:

SELECT COUNT(*) FROM votes WHERE specials_id = '1234' AND vote_type = '1'
...