2009-11-24 5 views
3

데이터베이스에 다양한 설정을 저장해야하는 PHP 앱을 만들고 있습니다. 클라이언트는 종종 테이블 디자인에 문제를 일으키는 특정 사항을 추가하거나 변경/제거 할 수 있는지 묻습니다. 기본적으로, 나는 다양한 설정이 특정 레코드에 대해 활성화되었는지 단순히 알려주는 많은 부울 필드를 가졌습니다.PHP/MySQL - 데이터베이스에 배열 저장

테이블을 더 이상 사용하지 않으려면 데이터를 직렬화 된 배열로 저장하는 것이 좋습니다. 나는 이것이 나쁜 습관으로 여긴다는 것을 읽었지 만, 나는 이것이 그러한 접근법을 사용하는 정당화 된 사례라고 생각한다.

이렇게하지 않는 이유는 무엇입니까?

감사의 말.

감사합니다.

+0

데이터를 정규화해야 할 필요가있는 것 같습니다. 테이블 구조를 게시 할 수 있습니까? –

답변

10

진짜 이유는 정규화이며,이를 수행하면 first normalform이 중단됩니다.

그러나 정상적인 형태의 위반이 고려 될 수있는 경우가 많습니다. 몇 개의 필드를 다루고 있으며 모두 불리언입니까?

  • 당신은 당신이 먼저 데이터베이스에서 현재 설정을 추출해야합니다 설정을 업데이트 할 필요는 문자열을 비 일렬 화 : (다른 사람의 사이에서) 다음과 같은 단점이있을 것이다 데이터베이스의 문자열로 직렬화 배열을 저장

    배열을 변경하고, 배열을 직렬화하고, 테이블의 데이터를 업데이트하십시오.

  • 검색 할 때 특정 사용자 (또는 사용자 집합)가 특정 설정을 사용하지 않도록 설정했거나 사용하도록 설정했는지 여부를 데이터베이스에 요청할 수 없으므로 검색 할 기회가 없습니다.

대신 다른 테이블의 일대 다 관계로 필요한 레코드로 다른 테이블을 만드는 옵션을 고려해야합니다. 따라서 빈 필드는 30 개가 아니지만 기본 옵션에서 벗어나는 각 옵션에 대해 행을 만들 수 있습니다 (이 옵션에는 기본값을 변경하는 경우와 같이 몇 가지 단점이 있습니다).

요약 : 적어도 앞서 언급 한 단점에 대해 조금만 신경 쓰면 배열을 직렬화하고 데이터베이스에 저장하는 것을 피해야한다고 생각합니다. (항상 최선의 방법이 아니다)

+0

훌륭한 답변입니다. 또한 데이터베이스에 '어레이 저장'을 원할 경우 데이터베이스 액세스를보다 객체 지향적 인 방식으로 수행 할 수있는 ORM을 살펴볼 수 있습니다. Doctrine은 PHP의 ORM 중 하나입니다. 그러나 교리를 배우는 것은 사소한 일이 아닙니다. –

+0

문제는 조인이 매우 비쌀 수 있으며 웹 응용 프로그램에서 다중 테이블 조인을 피하는 것이 일반적으로 보입니다. 객체를 캐시하고 Solr과 같은 검색 엔진을 사용하면 (검색 문제가 없어지면) 특히 그렇습니다. –

+0

@ Adam Gent : 동의 함. 보편적 인 해결책은 없지만 일반적으로 데이터베이스는 가능한 한 정규화되어야합니다. 그러나, 언급 한 바와 같이 직렬화, JSONified, ..., 배열을 데이터베이스에 저장하는 시나리오는 물론 있습니다. – phidah

0

확장 성은 제한되어 있습니다. 데이터베이스는 프로그래밍 환경과 섞여서는 안됩니다. 또한 데이터베이스와 디버깅의 값을 변경하는 것이 훨씬 쉽습니다. 데이터베이스와 cgi는 perl과 같은 다른 데이터베이스 또는 cgi로 상호 교환 될 수 있습니다.

0

관계형 데이터베이스를 사용하는 이유 중 하나는 데이터 무결성을 유지하는 것입니다. 만약 당신이 테이블의 blob에 덤프 된 직렬화 된 배열을 가지고 있다면, 그 blob에있는 것이 의미가 있다는 것을 데이터베이스가 검사 할 방법이 없다.

1

적절한 방법이지만

CREATE TABLE mytable (
    myid INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, 
    mytitle VARCHAR(100) NOT NULL 
); 
CREATE TABLE myarrayelements (
    myarrayid INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, 
    myid INT UNSIGNED NOT NULL, 
    mykey VARCHAR(100) NOT NULL, 
    myval VARCHAR(100) NOT NULL, 
    INDEX(myid) 
); 

$myarray = array(); 
$res = mysql_query("SELECT mykey, myval FROM myarrayelements WHERE myid='$myid'"); 
while(list($k, $v) = mysql_fetch_array($res)) $myarray[$k] = $v; 

은 때로는 쉼표로 구분 된 목록을 저장하는 것이 더 편리합니다.

0

설정을 서버의 구성 파일에 저장할 수없는 이유가 무엇입니까? 예를 들어 웹 사이트 또는 응용 프로그램 설정을 데이터베이스가 아닌 config.php에 저장합니다.