2013-12-10 4 views
0

포럼의 경우 사용자가 서로 메시지를주고받을 수 있도록하고 싶습니다. 이 테이블에 Contacts라는 테이블을 만들었습니다.이 테이블에는 5 개의 collumn이 있습니다 : user_id, 친구 저장 용, 가족 저장 용, 비즈니스 저장 용 및 다른 연락처 용. 이 마지막 네 개의 배열에는 모두 해당 배열 유형의 user_id가 들어있는 배열이 있어야합니다. 이 디자인을 선택한 이유는 friend1, friend2 등의 친구들의 양에 대해 사용자를 엄하게 입력하거나 제한하고 싶지 않기 때문입니다.MYSQL 필드에 배열 삽입

내 질문은 정확합니다. 어떻게해야합니까? ? 그렇지 않은 경우 무엇을 개선해야합니까? 그리고 어떤 유형의 MYSQL 필드가 친구, 가족, 비즈니스 및 기타가되어야합니까?

+0

여기에서 읽으십시오 http://www.tomjewett.com/dbdesign/dbdesign.php?page=manymany.ph –

+6

나쁜 디자인입니다. 개별 비트를 개인으로 액세스해야하는 경우 여러 필드의 데이터를 단일 필드에 저장하지 마십시오. 하나의 필드에 이들을 모두 저장하면 관련 데이터를 처리하는 데이터베이스의 기능이 제거됩니다. –

답변

0

serialize()unserialize() 기능을 사용합니다. Save PHP array to MySQL?

그러나,이 작업을 수행 할 것을하지 않는 것이 좋습니다 :

는 MySQL의에서 배열을 저장하는 방법에 대한이 질문을 참조하십시오. 나는 두 명의 사용자간에 모든 '연결'을 저장하는 별도의 테이블을 만들 것입니다. 예를 들어 John이 Ali를 추가한다고하면 Ali와 John에게 헌정 된 기록이 있습니다. 사용자의 친구를 찾으려면 Ali 또는 John이있는 레코드를 쿼리하기 만하면됩니다. 그러나 그건 내 개인적인 일을하는 방식입니다.

PHP/MySQL을 사용하여 필요할 때마다 사용자 친구에게 질문하는 것이 좋습니다. 이것은 상당한 공간을 절약 할 수 있고 많은 속도를 차지하지 않을 것입니다.

1

대신에 수행해야 할 작업은 연락처 테이블과 관련 테이블 (사용자, 친구, 가족, 비즈니스) 간의 맵 테이블입니다. 목적은 당신이 말한 것을 할 필요없이 varchar 등 필드에 압축 된 배열을 사용하지 않고 연락처와 사용자 간의 연결을 만드는 것입니다.

구조화 된 데이터 접근 방식은 훨씬 더 유연한 응용 프로그램을 제공합니다.

예. UserContacts 테이블은 고유 한 기본 키 (id), Users의 외래 키 및 Contacts의 외래 키를 포함합니다. 각 유형별로이 작업을 수행하면 원하는 때에 언제든지 다른 사용자에게 데이터를 손상시키지 않고도 원하는 수의 사용자와 연락처간에지도를 쉽게 삽입하거나 수정할 수 있습니다. 복잡한 논리가 없으면 다음과 같은 문구를 없앨 수 있습니다. 1,2,3,4,5 또는 1|2|3|4|5 :

이 구조를 사용하기 위해 올 때
id, user_id, contact_id 

는 그럼, 당신은 같은 것을 할 수 있습니다 :

SELECT 
    Contacts.* 
    -- , Users.* -- if you want the user information 
FROM UserContacts 
LEFT JOIN Contacts ON (UserContacts.contact_id = Contacts.id) 
LEFT JOIN Users ON (Users.id = UserContacts.user_id) 
0

배열을 저장하기 전에 직렬화하고 검색 후 직렬화를 해제하십시오.

$friends_for_db = serialize($friends_array); 
// store $friends_for_db into db 

그리고 검색하기위한

:

// read $friends_for_db from db 
$friends_array = unserialize($friends_for_db); 

그러나, 적절한 대다 디자인 설정에 대한 다른 답변을 따르도록 현명해야한다.

그럼에도 불구하고, 완벽한 솔루션이 필요하지 않은 사소한 상황에 대해 이러한 종류의 디자인이 필요했습니다 (예 : 사용자에게 표시하는 것 이외에 쿼리하거나 사용하지 않는 일부 다중 선택 목록 값을 쉽게 저장/검색하는 등).)