부모가 ProductCategory
이고 자식이 Product
입니다. 예를 들면 : ProductCategory
주어진 옵션문자열 화 된 데이터를 효율적으로 검색하려면 어떻게해야합니까?
ProductCategory --- Product
Drill --- DeWalt DWD 112
--- Black & Decker 5 C
Bicycle --- Motobecane Turino ELITE Disc Brake
--- Shimano Aluminum
모든 Products
가 서로 비교되어야 속성 집합이있다 (즉, 데이터를 가지고). 그러나이 속성 집합은 ProductCategories
과 같이 다를 수 있습니다. 예를 들어 드릴의 ProductCategory
의 경우 속성은 Voltage, Amps, Corded vs Cordless
일 수 있습니다. Every Product
드릴에 이러한 정보가 있어야합니다. 그러나 자전거의 ProductCategory
의 경우 속성은 Size, Road vs Mountain
이어야하고 모든 Product
자전거는이 정보가 있어야합니다. (드릴 또는 자전거에 대해 아무것도 모르는 죄송합니다 ... 내가 이것을 골랐다는 이유는 어리 석다)
주어진 Product
에 대해 DB를 설계하려고하는데, 그 속성은 내가 쉽게 할 수있는 것이다. 수색. 예를 들어, 이상적으로는이 명령을 실행할 수 있습니다 심지어,이 후 나는 Product
모든 ProductCategory
에 대한 모든 속성에 대한 열을 가지고해야 할 것 때문에 ... 흥미로운 트레이드 오프를 제시하는 것
drills = Product.where(product_category_id:1)
drills.where("voltage >= ?", 5)
-> returns the individual drills, which may include DeWalt but not Black & Decker
을 그 그것과 관련이 없다. 예를 들어 :
# Product columns
:voltage, :integer #for Drill
:amps, :integer #for Drill
:corded, :boolean #for Drill
:size, :integer #for Bicycle
:mountain, :boolean #for Bicycle
...
이 지속하지 않는 것 ... 당신은 ProductCategories
에 대한 몇 가지 곧 Product
열 무한한 수있을 것이라는 점을 매우 신속하게 볼 수 있습니다!
# ProductCategory has a column...
:required_attributes, :text
ProductCategory.where(name:"Drill").first.required_attributes
-> "voltage,amps,corded"
ProductCategory.where(name:"Bicycle").first.required_attributes
-> "size,mountain"
# Product has a column...
:attribute_data, :text
Product.where(name:"DeWalt").first.attribute_data
-> "{'voltage':5,'amps':5,'corded':5}"
함께 : 스펙트럼의 타단
, 나는 캐릭터 데이터로서Product
그들을 저장/이러한 특성을 요구하는 다음 상위
ProductCategory
각
Product
요구 정의하는 특성을 갖는 한 생각 위의 디자인을 적용하면,
Product
생성시마다
required_attributes
에 대한 정보를 쉼표로 분할 한 후에 정보를 제공해야한다는 프런트 엔드를 만들 수 있습니다. 그러나 물론 이것은 검색 효율성을 떨어 뜨립니다. 최소한 그것이 그렇다고 생각합니다. 그래서 이것이 제 질문입니다.
문자열 화 된 데이터를 효율적으로 검색하려면 어떻게해야합니까? 최소 5 볼트 이상의 모든 드릴을 검색하려면 아래를 완료하십시오.
drills = ProductCategory.where(name:"Drill")
drills.where("attribute_data ...")
업데이트 된 답변보기 –
정말 좋은 답변이 아니므로 내 대답을 삭제했습니다. 그러나 이것은 매우 광범위하게 SO에서 대답 할 수있는 질문이 아니며 EAV 테이블 및 JSON 열과 같은 기존 패턴에 대한 지식이 약간 필요합니다. – max
나는 그 @max를 얻는다. 그러나 나는 그 안에서 참조가 유용하다는 것을 발견한다. 나는이 넓은 주제를 탐구하고있다. 코멘트로 다시 게시 하시겠습니까? – james