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