2011-01-04 5 views
4

관리자가 사용자 입력 양식의 내용을 변경 (즉, 임의의 필드 추가) 할 수있는 응용 프로그램을 작성해야합니다. 그 내용은 데이터베이스에 저장됩니다. Modx/Wordpress/Expression Engine 템플릿 변수를 생각해보십시오.유연한 양식 및 지원 데이터베이스 구조

스펙에서 일관성이있는 구체적인 테이블 (예 : 사용자 프로필, 사용자 콘텐츠 등) 및 특정 값을 저장하기위한 일반 필드 데이터 테이블 (예 : 텍스트, 부울)을 구현하는 방법을 살펴 보았습니다. 양식 (및 모델 필드)은 먼저 테이블을 쿼리하고 관련 열을 검색하여 생성됩니다. 그러나 검증 방법을 설정하는 방법에 대해서는 아직 생각하지 못했습니다.

이 문제를 살펴본 결과 EAV 유형의 접근 방식을 보여주고있는 것으로 보입니다. 짧은 연구에서 볼 때 유연성이 가져다 줄 축복보다 더 큰 부담이 될 수있는 것처럼 보입니다. 사람이 있다면 나는이 문제에 대해 조언을 감사하겠습니다

How to design a generic database whose layout may change over time?

Dynamic Database Schema

:

나는이 위험한 길이다 제안 그러나 여기 게시물의 몇 가지를, 읽었습니다 일부주는

관련

SWK

답변

3

나는 아주 큰 EVA 데이터베이스를 몇 년 전에 만들었습니다 (PHP w/PostgreSQL). 그것은 좋았지 만 커다란 프로젝트 ($$$)였습니다. 모든 양식은 양식/필드 버전 관리, 게시 워크 플로, 동적보고 일치 등 완전히 동적이었습니다.

EVA 기본 사항은 충분히 쉽습니다. 데이터를받는 것이 어려운 부분이 아닙니다. 그러나 버저 닝 및보고를 작성하면 ... 몇 년을 올바르게 지낼 수 있습니다.

오늘 내가 다시하고 있다면, 새로운 NoSQL 솔루션 (http://en.wikipedia.org/wiki/NoSQL#Document_store) 중 하나를 사용하여 연구 할 것입니다. 양식 생성기에 전달할 수있는 DTO 스타일 클래스를 만드는 방법에 대해 알아 보겠습니다. 양식 수정 "은 실제로 DTO를 수정합니다. 그런 다음 DTO를 문서/객체 데이터베이스에 보관할 것입니다.

또한 알파 솔루션을 구축 할 때 버전 및보고 요구를 포괄하는 테스트 사례를 해결하는 방법을 생각해보십시오.

다음은 내가 말하는 의미의 예입니다. 간단한 "Ask Question form".

  • 원본 (버전 1) :이 첫째, 마지막 질문
  • 이메일 필드를 추가 (버전 2) : 첫째, 성, 이메일, 질문
  • 누군가가 이메일에 대한 자신의 마음을 변경 : (버전 3) : 첫째, 마지막 질문
  • 새로운 마케팅 사람이 들어오고 그것을 변경 (버전 4) : 전체 이름, 이메일, 질문

이제 보고서 (csv)를 생성해야합니다. 상황이 까다로워집니다. 어떻게 할 수 있니?

우리는 이전 버전에 대한 참조로 필드 레벨 버전 관리를 통해이 문제를 해결했습니다. 또한보고 시스템에서는 최종 사용자가 실행하기 전에 보고서 데이터 소스의 정의를 조합해야했습니다. (보고서 필드를 데이터 필드에 바인딩하는 등).

그러나 문서 DB를 사용하면 다르게 할 수 있다고 생각합니다. I 새로운 DB의 CouchDB (다른 사람)는 이러한 문제를 처리하기위한 메커니즘을 가지고 있다고 믿습니다.

행운을 빌어 요 !!

0

필요에 따라 양식 필드를 "DB 필드"수준으로 끌어 올 수도 있습니다. 대신 동적 블로 브 (본질적으로 a 란 무엇인가)에서이 필드를 직렬화하여 DB에 저장할 수 있습니다. 이것은 앱 외부에서 이러한 동적 필드를 쿼리해야하는 사람들이있는 경우에는 권장되지 않습니다 (즉, DB 디자인은 통합 시스템을 사용하는 더 큰 공개 계약의 일부 임).하지만 단순히 앱을 사용하여 계속 유지하는 경우 이러한 동적 필드 또는 필드 내의 집계/검색 기능이 사소한 경우에는 (특히 요즘에는 CPU 기능을 제공해야 함) 고려해야합니다. 나는 패턴을 여러 번 사용했고, 지금까지는 리팩터링을하지 않았습니다. (그러나, 나는 당신이 필요로 할지도 모르는 경우를 이해할 수있다).

1

마지막 webapp에서 사용자 프로필을 개발할 때 키/값 표을 선택했습니다. 여기 내 DB 설계 보이는 방법은 다음과 같습니다 프로필 표 (사용자 hasMany의 프로필)과 연결

Users table with fixed columns: 
id 
login 
name 
regdate 

사용자 테이블.

Profiles table with different data: 
user_id 
field 
value 

이 방법은 사용자가 자신의 프로필에 어떤 추가 필드를 추가 할 수 있습니다. 예를 들어

user_id = 1  
field = 'Facebook' 
value = 'http://facebook.com/...' 

user_id = 1 
field = 'Stackoverflow' 
value = 'http://stackoverflow.com/user/...' 

및 ..

관련 문제