2011-05-13 5 views
2

배지 시스템을 구현하려는 중입니다. 배지는 변경 될 수있는 사용자의 메타 데이터를 기반으로합니다.EAV 대 직렬화 된 객체 대 Xpath가있는 SQL?

이러한 메타 데이터는 가변적이며 즉시 설정됩니다. 메타 데이터의

예 : isActiveMember

  • commentCount
  • hasCompletedProfile
  • 나중에, 내가 이런 이유로, hasGravatar 메타 데이터를 추가 할 것 등 난 쉽게 할 수 없습니다 테이블을 디자인하고 정규화하십시오.

    이러한 데이터는 응용 프로그램에서 중요한 부분을 차지하지만 '합리적인'것이 아니기 때문에 거의 모든 메타 데이터를 다시 계산할 수 있습니다. 이는 데이터의 무결성이 제약 조건이 아니라는 것을 의미합니다.

    현재 내가 알지는 못하더라도 세 가지 옵션을 알고 있습니다.

    • EAV
    • 직렬화 된 객체
    • XML 필드 (나는 열에 XML을 저장하는 것이 가능하다는 것을 어딘가에 읽고, 데이터를 쿼리하는 XPATH 또는 무언가를 사용)

    이 모든 옵션은 프로 & 죄수 팀을 가지고있는 것처럼 보이지만, 나는 결코 그들과 실험을 해본 적이 없기 때문에, 나는 정말로 모른다.

    의견이나 조언이 있으십니까? 당신은 가능성이 임의의 데이터를 저장하기 위해 1 열을 사용하는 것 같은 나는 현재 MySQL 서버

답변

2

XML 및 직렬화 된 객체와 젠드 프레임 워크 & 교리이 함께 일하고 있어요

은 모두 매우 유사합니다. 이것은 매우 복잡해지며 SQL WHERE 절에서 쉽게 구별하기가 어렵습니다. (일부 DBMS는 XPath를 지원하지만)

EAV는 사용자가 가지고있는 Key => Value 쌍마다 별도의 행을 제공합니다. 조인 또는 서브 쿼리. 큰 타격은 로트이 여기에있는 경우 성능이 저하 될 수 있다는 것입니다. 또 다른 단점은 모든 키/값을 db의 텍스트로 저장한다는 점입니다. 모든 유형에 대해 EAV 테이블을 만들 수 있지만 가져 오는 내용이 문자열로 나오거나 어쨌든 변환 될 수 있으므로 대부분의 언어에서 실제로 필요하지는 않습니다. 사용자 구성/등록 정보를 저장하기 만하면 EAV에 완벽하게 적합해야합니다.

SELECT * FROM user_metadata WHERE metadata_user_id = $user_id 

을 또는 당신과 함께 개별 메타 데이터를 가져올 수 : 그런 다음 사용자에 대해 한 번에이 데이터를 가져올 수

metadata_id INTEGER 
user_id INTEGER 
key CHAR 
value CHAR 

:

그래서 당신은 3 개 필드와 테이블 user_metadata이있을 수 있습니다 사용자 데이터

SELECT user.*, meta_gravatar.value AS hasGravatar 
FROM user 
LEFT JOIN user_metadata AS meta_gravatar 
ON meta_gravatar.user_id = user.user_id AND meta_gravatar.key = 'hasGravatar' 
WHERE user.user_id = $user_id