Разработка моей базы данных MySQL для оценки вещей в разные дни

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

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

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

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

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

2 ответа

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

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;

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

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'
Другие вопросы по тегам