2009-08-16 2 views
0

모두 안녕하세요. 저는 현재 조리법에 대해 매우 효율적인 웹 사이트를 구축하고 있습니다.DB 테이블 및 인덱스에 대한 조언 제공

각 조리법에는 10 가지 이하의 성분이 있습니다.

성분이 주어지면 1) 주제가있는 모든 요리법과 2) 1) QUICKLY의 각 요리법에있는 다른 모든 재료를 어떻게 찾을 수 있습니까?

내 초기 계획은 다음과 같습니다. (이유에 대해 설명합니다. 모든 사람이 이해하기 쉽도록 구문이 언어에만 해당하지 않음에 유의하십시오. MySQL에서 먼저이 작업을 수행하고 있으며 가능한 경우, 나는 tokyodb와 같은 기능이 적 으면서 더 빨리 뭔가를 수행하려고 할 것입니다.

Create TABLE mapping: 
# This table holds all the names of everything, hopefully storing int 
# will cause less IO 
id int(32) 
name char(32) 
index/key (name) 

Create table recipes: 
# Note that ing1 - ing10 are not nulls, zero will be used for empty 
name char(32) 
ing1 int(32) 
ing2 int(32) 
ing3 int(32) 
ing4 int(32) 
ing5 int(32) 
ing6 int(32) 
ing7 int(32) 
ing8 int(32) 
ing9 int(32) 
ing10 int(32) 
index/key on name 

create table relationship: 
# This table holds the relationship between ingredients and recipe 
ing int(32) 
recipe int(32) 
key/index on ing 

너희들은 어떻게 생각하니? 누군가 더 나은 구현을 생각할 수 있습니까?

+0

조언 -> 조언 – moo

답변

0

별도의 성분 표가 필요하다고 생각합니다. 성분에 대한 세부 사항을위한 공간이 없기 때문에 언젠가 공급 업체 참조 또는 제품 코드를 포함시킬 수 있습니다.

관계 테이블을 통해 이미 recipe-incredient 세트를 추측 할 수 있으므로 ing1-10 필드가 필요하지 않습니다.

관계 테이블을 ingredientsUsage 테이블이라고합니다. 수량과 같은 필드가 필요할 수 있습니다.

ing이 선택한 ID 인 ingredientsUsages를 쉽게 검색하고 레시피에 가입하고 다른 재료의 igredientUsage 및 재료에 다시 가입 할 수 있습니다.

+0

모든 정보가 실제로 "1) 주제가있는 모든 요리법, 2) 각 요리법에있는 다른 모든 재료"라고 말합니다. 귀하의 아키텍처를 구현하면 모든 레시피 검색은 내 "DB"를 통해 전체 "관계"테이블을 스캔해야합니다. 성능에 큰 영향을 미치지 않을까요? (색인 생성이 있더라도). 레시피 조회를 위해 구식 레시피를 더욱 중요하게 생각합니다. –

+0

인덱스를 사용 중인지 검사하지 않습니다. Realtionship은 반드시 recipeId와 ingredientsId에 대해 색인이 생성됩니다. 직감은 신뢰할 수있는 가이드가 아니며, 가정은 어떤 가정을 검증해야하지만, 내 추측에 따르면 이것은 괜찮을 것입니다. 그렇게 생각해 보면, 디자인에 관계없이 관련 크기의 더미 데이터베이스를 구축하고 중요한 쿼리가 수행되는지 확인하기 위해 노력을 기울이지 않아야합니다. 심각한 코드를 작성하기 전에 그렇게하는 것이 좋습니다. – djna

1

성분에 대한 조리법 색인은 매우 좋습니다. 그러나 그것은 또한 당신의 요리법 테이블을 무의미하게 보입니다.

이 조리법은 4 가지로 구성되어있다 : 성분의

  1. 목록입니다.
  2. 각 성분의 양.
  3. 레서피의 이름.
  4. 준비 및 조리 지침 (실제 제조법으로 간주 될 수 있음).

당신이 성분 인덱스 번호로 레시피 인덱스 번호가, 당신이 정말로 조리법 자체 내에서 각 성분의 인덱스 번호를 나열 할 필요가 없습니다 인덱스 테이블이 그렇다면. 당신은 실제로 당신의 레서피/성분 지수에 성분의 양 (0.1과 100 사이의 간단한 부동 숫자, 말하자면)과 그 양의 단위에 대한 또 다른 칼럼 (온스 , 큰 스푼, 컵, 등등.) 다른 테이블을 기반으로, 나는 당신이 가능한 측정의 테이블에 연결되는 정수가되고 싶을 것이라고 상상합니다. 말하자면, "계란"과 수량이 "3"인 성분이 "온스"또는 "컵"을 필요로하지 않고 "3 개의 계란"으로 해결 될 수 있도록 "자기"와 같은 측정법을 원할 것입니다 .

또한 "0이 사용됩니다"라고 말했지만 어떤 경우에는 레시피가 0을 요구합니까? 그냥 궁금해서.

그래서 결과는 다음과 같습니다 이제

#table of recipes names 
id int(32) 
name char(32) 

#table of ingredients 
id int(32) 
ingredient char(32)  

#table of instructions 
id int(32) 
rec_id int(32) #foreign key for recipes 
instruct text 

#table of units 
id int(32) 
unit (text) 

#table of recipe-ingredients 
id int(32) 
rec_id int(32) #foreign key for recipes 
igred_id (32) #foreign key for ingredient 
quant float(5, 2) #amount per ingred 
unit_id int (32) 

당신이 모든 재료가 체크 해제 어떤에 대한 쿼리를 수행하거나 할 수 있습니다, 그것은 일치하는 조리법의 인덱스를 반환 할 수 있으며,에 목록으로이 당신이 출력 사용자. 사용자는주의를 기울이는 처방을 선택하여 처방 지시에 대한 쿼리와 처방 구성 요소 (이미 동일한 테이블에 금액이 있음)에 대한 다른 쿼리를 트리거합니다.

+0

남자 나는 왜 당신이 많은 추가 정보를 추가 할 것인지 모르겠다. 어쩌면 나는 분명하지 않을 수도 있습니다. 그래서 주어진 재료를 통해 1) 주제가있는 모든 요리법과 2) 1) QUICKLY의 각 요리법에있는 다른 모든 재료를 어떻게 찾을 수 있습니까? –

+0

수량이나 지침이없는 요리법을 원하십니까? 꺼내. 어쨌든 기본적인 모양은 합리적입니다. "빨리"라고 말하지 마십시오. 얼마나 빨리 말해야합니다 - 모든 공연 작품에서 명시적인 목표를 설정 한 다음 도달 할 수 있는지 확인하십시오. 예. 브라우저 사용자는 1 초 이내에 하나의 래서 피를 검색합니다. db 쿼리가 20 밀리 초 또는 25 밀리 초 또는 100 밀리 초에 기여하면 중요한지 고려하십시오. – djna

+0

@phroxy. 나는 어떤 추가 정보도 추가하지 않았다. 귀하의 모범이하지 못한 정보를 설명했습니다. 필자는 recipe_ingredients 테이블을 제거하여 정보를 가져 왔습니다. 내 레이아웃을 감안할 때 이제는 하나의 테이블에서만 제공된 모든 recipe_numbers에 대해 간단한 쿼리를 수행 한 다음 레서피 이름에 조인을 수행 할 수 있습니다. 인생을 더 쉽게 만들려고해서 죄송합니다. – Anthony