2013-05-06 2 views
1

내 웹 사이트에서 내 서비스 구성원은 모든 연락처를 저장할 수있는 연락처 데이터베이스를 제공합니다. 이 데이터베이스는 회원에게 더 맞는 맞춤형으로 생각됩니다. 대화 상대를 입력 할 때 이름과 제목과 같은 모든 표준 질문을 묻고 contacts 테이블에 저장합니다. 그런 다음 전화, 주소, 이메일 및 웹 사이트와 같은 추가 필드를 방문하십시오. 그러나 연락처는 여러 사람이 참여할 수 있으므로 멤버가 무제한으로 입장 할 수 있기를 바랍니다. 나는 각 필드에 대해 테이블을 만들어이 작업을 수행했다. contacts_phone, contacts_address, contacts_email, contacts_website 그리고 각 행은 id, parent 및 data를 가졌다.MySQL/PHP : 데이터베이스 레이아웃, 정렬 및 검색

이렇게하면 적절한 검색을 수행하는 것이 매우 어려워졌습니다. 이러한 추가 필드가 연결되는 유일한 방법은 연결된 연락처의 ID를 보유하는 parent입니다. 또한 다른 버그와 오류가 발생하여 그 아이디어를 무시하고 실패로 간주하기로 결정했습니다.

이제 각 필드의 최대 10 배를 입력 할 때 회원을 제한하기로 결정했습니다. 따라서 테이블 contacts에는 수백 개의 열 (phone_1_data, photo_2_data, phone_3_data, ect.)이 있으며 지저분하고 잘못되었습니다. 검색, 정렬 및 상호 작용이 훨씬 쉬워 지지만 최상의 방법처럼 보이지는 않습니다.

답변

1

모든 사용자 정의 열에는 연락처 ID, 문자열 키 및 문자열 값이있는 간단한 키 - 값 테이블을 추가하십시오. 이를 사용하여 임의의 사용자 정의 필드 수를 연락처에 일치시킬 수 있으며 JOIN을 사용하여 검색 가능한 상태로 유지됩니다.

SELECT `key`, `value` FROM `custom_fields` WHERE `contact_id` = ? 

특정 사용자 정의 필드의 특정 값으로 연락처를 검색하려면 :

CREATE TABLE `custom_fields` (
    `contact_id` INT, 
    `key` VARCHAR(63), 
    `value` VARCHAR(255) 
); 

연락처에 대한 모든 추가 필드 얻으려면

SELECT `contact`.* FROM `contacts` 
JOIN `custom_fields` ON `custom_fields`.`contact_id` = `contacts`.`contact_id` 
WHERE `custom_fields`.`key` = ? AND `custom_fields`.`value` = ? 

또는를 찾을 수 맞춤 입력란의 특정 값과의 연락 :

SELECT `contact`.* FROM `contacts` 
JOIN `custom_fields` ON `custom_fields`.`contact_id` = `contacts`.`contact_id` 
WHERE `custom_fields`.`value` = ? 
+0

저는 MySQL에 대한 교육을 많이받지 못했습니다.이 답변으로 다소 혼란 스럽습니다. 어쨌든 예제를 보여줄 수 있습니까? –

+0

고마워, 나는 아직도 'JOIN'을 완전히 이해하지 못한다. 당신의 모범을 보는 것조차 혼란 스럽지만 나는 그것을 제대로 사용하는 법을 배울 수 있도록 그것을 공부하는 데 시간을 할애 할 것입니다. –

1

반복 가능한 요소를 별도의 테이블에 저장하는 올바른 길을 걷고있었습니다. 왜 "적절한 검색을 진행하는 것이 매우 어려워 졌습니까?"

학부모 ID에 가입하면 약화가 있었을 것입니다. 아마도 세부 테이블을 정렬하거나 해제하기 위해 다른 컬럼이 필요했을까요?

PARENT_ID, data_desc, 데이터 '123', 'mobile1은', '123.456.7890'

은 장기적으로 더 많은 고통의 원인이됩니다 접촉 행에 새 열을 추가. 자신에게 가장 적합한 테이블 디자인 아이디어를 보려면 "데이터베이스 정규화"를 참조하십시오.

+0

가장 큰 약점은 MySQL입니다. 나는 여전히 'JOIN'의 개념을 이해하지 못하거나 어떻게 사용할지 이해하지 못합니다. 너와 애드리안은 내가이 일을하는 길인 것처럼 보이기 때문에 너 자신에 대해 교육해야한다는 것을 깨닫도록 도와 주었다. 고맙습니다. –