首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >设计我的MySQL数据库,以便在不同的日期对事物进行评级

设计我的MySQL数据库,以便在不同的日期对事物进行评级
EN

Stack Overflow用户
提问于 2011-07-07 10:17:03
回答 2查看 329关注 0票数 0

我最近一直使用reddit作为我的帮助,他们一直很棒,但后来我找到了这个网站,并觉得它是一个更合适的地方来问我的问题。希望这种有益的趋势在这里继续下去。让我开始说,我知道这个项目是相当密集的考虑到我以前从来没有做过这样的事情,但是这并不能改变我正在做它的事实,我愿意学习如何做。

我正在设计一个网站,将为我的城市的酒吧和餐饮特色。用户将能够登录,主页将显示当天排名前5的酒吧特价/快乐时间,以及当天的前5个餐饮特价/快乐时间(即周一、周二等)。每个“特殊”将有一个向上向下的评级,供用户在特别上给出他们的输入。

一个酒吧页面将列出所有的酒吧和他们当天的特价,并选择投票赞成或反对的特别。就餐页面也是如此。从那里,用户可以单击条形图名称,转到专门关于该条形图的页面。该页面将显示整个星期的特价。

我现在正在用phpmyadmin设计MySQL表,因为在为设计编写了html和css之后,我似乎需要从这里开始。我尝试在谷歌上搜索一个我可以构建的框架,但是我没有找到任何相关的东西。

最好是在每个数据库下为一周中的每一天创建单独的表,将所有内容放入一个表中,或者完全以另一种方式放入。这就是我到目前为止所做的,让我知道我是否在正确的轨道上。万分感谢!(http://dl.dropbox.com/u/16887445/Screen%20shot%202011-07-06%20at%208.01.10%20PM.png)

EN

回答 2

Stack Overflow用户

发布于 2011-07-07 10:42:23

星期几是“特价”记录的属性,而不是记录本身。想象一下--如果你每天有一张桌子,你想要得到一周内一家酒吧的所有特色菜,你将不得不进行7个查询:

代码语言:javascript
复制
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>;
...

这显然是一个糟糕的设计(希望如此)。你想要做的是能够用一个查询做到这一点:

代码语言:javascript
复制
SELECT * FROM specials WHERE
  establishment_id = <id> and date >= <sunday> and date <= <saturday>;

还要注意的是,您甚至并不真正关心存储星期几,您所需要的只是日期(无论如何都需要),您可以从中提取星期几。我会创建一个类似这样的模式:

代码语言:javascript
复制
-- 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)
);

因此,要显示"My Bar“的特色菜,您可以执行以下操作:

代码语言:javascript
复制
$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;

要显示周一排名前五的特价菜,请执行以下操作:

代码语言:javascript
复制
SELECT * FROM specials WHERE special_date = <monday> ORDER BY rating DESC LIMIT 5;
票数 1
EN

Stack Overflow用户

发布于 2011-07-07 10:34:50

如果我正确理解了您要做的事情,我可能就是这样设计模式的:

代码语言:javascript
复制
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)
...

一旦对数据进行了标准化,就可以使用查询或视图来提取聚合数据。例如,要查找某个特殊项目的所有up投票,您可以使用如下查询:

代码语言:javascript
复制
SELECT COUNT(*) FROM votes WHERE specials_id = '1234' AND vote_type = '1'
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6605142

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档