2011-07-07 2 views
0

나는 최근에 나의 도움으로 reddit을 사용 해왔다. 그리고 그들은 훌륭했으나이 사이트를 발견하고 내 질문을하는 것이 훨씬 더 적절한 곳이라고 생각한다. 다행스럽게도 유익한 추세가 여기서 계속되기를 바랍니다. 제가이 프로젝트가 전에는 그렇게 해본 적이 없다는 것을 고려하면 꽤 집중적이라는 것을 알면서 시작하겠습니다.하지만 제가 그 일을하고 있다는 사실을 바꾸지 않고 어떻게 배우고 싶습니다.다른 요일에 물건을 평가하기 위해 MySQL 데이터베이스 설계하기

나는 내 도시에 술집과 식당을 특색으로 삼을 웹 사이트를 디자인하고 있습니다. 사용자는 로그온 할 수 있으며 홈 페이지에는 해당 등급의 상위 5 개 레스토랑/해피 아워 및 상위 5 개 레스토랑/해피 아워 (즉, 월요일, 화요일 등)가 표시됩니다. 각각의 "스페셜"은 사용자가 스페셜에 자신의 의견을 제공하는 업 다운 등급을 갖습니다.

막대 페이지에는 해당 날짜의 모든 막대와 특별 판매 품목이 표시되며 특별 판매 품목을 upvote 또는 downvote 할 수 있습니다. 식사 페이지와 같은 거. 거기에서 사람은 바 이름을 클릭하여 해당 바에 대한 페이지로 이동합니다. 그 페이지는 1 주일 동안 특별 상품을 보여줄 것입니다.

phpmyadmin에서 MySQL 테이블을 디자인하는 중입니다. 디자인을 위해 html과 css를 작성한 후에 시작해야합니다. 내가 구축 할 수있는 프레임 워크에 대해 인터넷 검색을 시도했지만 관련성이 전혀없는 것은 아닙니다.

각 요일마다 각 데이터베이스 아래 별도의 테이블을 만들거나 모든 것을 하나의 테이블 또는 다른 방법으로 배치하는 것이 가장 좋을까요? 이것은 내가 지금까지 만든 것입니다. 제가 올바른 방향으로 가고 있는지 알려주십시오. 대단히 감사합니다! ! (http://dl.dropbox.com/u/16887445/Screen%20shot%202011-07-06%20at%208.01.10%20PM.png)

답변

0

내가 무슨 일을하는지 이해한다면 당신이 데이터를 정규화 일단,

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' 
+0

투표를 직렬화하면 안됩니다. 간단한 INT 필드가 수행하는 작업을 수행하기 위해 매우 비싼 조인이 필요합니다.지혜롭게 말하자면, 월요일에 상위 5 개의 특별 스페셜을 결정하는 쿼리는 무엇입니까? :) –

1

날은 "스페셜"레코드의 속성, 그 자체에게 기록이다. 이 사진 - 당신은 하루에 하나 개의 테이블이 있고, 일주일에 한 줄에 대한 모든 스페셜을 얻으려면, 당신은 일곱 개 쿼리 수 있도록해야합니다 : 분명히 나쁜

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>; 
... 

이 (희망)입니다 디자인. Whay 당신이 원하는 것은 하나 개의 쿼리와 함께 할 수 있어야하는 것입니다 : 또한 당신도 정말 요일을 저장하는 걱정하지 않는 것이

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

주, 당신이 필요로하는 모든 당신이 필요로하는 (날짜입니다 어쨌든)에서 요일을 추출 할 수 있습니다. 월요일

$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; 

표시하려면 상위 5 개 평가 스페셜 : 당신이 그런 짓을 "내 바"를위한 스페셜을 표시하는, 그래서

-- 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) 
); 

:이 같은 스키마 뭔가를 만들 것 :

SELECT * FROM specials WHERE special_date = <monday> ORDER BY rating DESC LIMIT 5; 
관련 문제