2011-04-28 8 views
8

웹 페이지에서 데이터베이스 (SQL SERVER 2005) 테이블의 행을 표시하려고합니다. 이 행은 Status 테이블 (예 : id, name, modifiedDate)에 의해 추가로 정의 된 statusID (외래 키)를 포함합니다.프리젠 테이션 데이터를 데이터베이스에 저장할 수 있습니까?

다양한 상태가 다르게 표시되어야합니다 (단순히 다른 배경색을 사용한다고 가정 해 보겠습니다).

나는 PHP를 사용하여 데이터베이스를 쿼리하고 웹 페이지 테이블을 작성한다. 테이블을 만들면서 해당 행의 상태에 따라 CSS 클래스를 요소에 적용 할 것입니다.

나는이 작업을 수행하려면 적어도 2 가지 옵션이 있습니다 :

  1. 그것을 처리하는 PHP 코드 로직을 정의를하고, 상태가 데이터베이스에서 변경하는 경우, 나는 코드를 변경해야합니다.

  2. "클래스"를 데이터베이스에 저장하고 저장된 클래스를 적용하기 만하면됩니다.

후자의 옵션이 나에게 좋을 것 같지만 데이터베이스에 프리젠 테이션 데이터를 포함하는 것이 나쁜 설계 선택 인 경우 확실하지 않습니다. 이것은 여러 인트라넷 유틸리티를 만드는 기초가 될 것이며, 나는 오른발에서 시작하고 싶습니다.

+0

는 클래스 _attribute_을 적용 의미 "CSS 클래스를 적용?" ;) –

+1

컨벤션 이상의 컨벤션? 상태 테이블의 각 레코드에 대해 "status_ "CSS 클래스를 만들면 ... CSS 클래스 이름에 적합하지 않은 공백과 다른 문자를 제거하기위한 표준 문자열 수정을 적용하기 만하면됩니다. – Schwartzie

+1

당신은 여러 가지 상태를 추가 할 것이라고 생각합니까? 사용자가 상태와 모양을 사용자 정의 할 수 있도록 허용하는 경우 클래스를 추가 할 수 없기 때문에 클래스 정보를 저장하지 않을 수 있습니다. 배경 색상이나 글꼴 색상과 같은 맞춤형 옵션을 저장할 수 있습니다. 일반적으로 상태는 잘 정의되어 있으므로 많이 변경되면 안됩니다. 적절한 클래스를 반환하는 GetStatusClass (statusValue)와 같은 간단한 함수는 많이 변경되면 안됩니다. – Prescott

답변

4

프레젠테이션 데이터를 포함하여 데이터베이스에 데이터를 저장하는 데는 아무런 문제가 없습니다. 적은 코드 작성으로 효과적인 결과를 얻을 수 있다면 도움이됩니다. 확인해야 할 것은 프리젠 테이션 로직데이터베이스 로직을 섞어서는 안된다는 것입니다.

elementInfo 개체 (예 :)의 속성에 프레젠테이션 계층의 데이터를 캡슐화하여 이러한 우려를 분리 할 수 ​​있습니다.당신이 얘기하는 CSS 클래스이기 때문에

프리젠 테이션 데이터는비즈니스 데이터 분리 보관해야합니다. 따라서 프레젠테이션 데이터와 비즈니스 데이터를 모두 데이터베이스에 저장하는 것은 좋지만 동일한 테이블에 저장하는 것은 용납되지 않습니다.

업데이트 : 의견 아니요, PresentationClassRecord의 ID를 비즈니스 개체에 FK로 추가하면 안됩니다. 나는 아래 db에 접근하는 샘플을 만들었습니다. 나는 DummyTable을 비즈니스 오브젝트라고하고 나머지는 스펙을 따릅니다. 가장 관련 부분은 이제 두 가지 간단한와 StatusPresentationAssignmentTable

----------------------------------------------- 
DummyTable 
----------------------------------------------- 
Id  Name  SomeOtherDataField StatusId 
PK int varchar int     FK int 

----------------------------------------------- 
StatusTable 
----------------------------------------------- 
Id  Name  ModifiedDate 
PK int varchar datetime 

----------------------------------------------- 
PresentationTable 
----------------------------------------------- 
Id  PresentationType Value 
PK int varchar    
sample data: 
43  CssClass   prettyBackground 

----------------------------------------------- 
StatusPresentationAssignmentTable 
----------------------------------------------- 
StatusId PresentationId 
FK int  FK int 

프레젠테이션 데이터를 얻을 수 있습니다 절을 조인과는 완전히 비즈니스 데이터에서 분리된다. Dummy의 Status가 프리젠 테이션 과제를 가지고 있다면 당신의 스크립트는 체크와 같은 것을 할 수 있습니다. 그런 다음 PresentationType을보고 프레젠테이션 데이터를 프레젠테이션에 적용하는 적절한 함수를 가져 와서 실행합니다. (값을 처리하는 방법을 알고있는 각 PresentationType에 대해 함수가 필요합니다. function applyPresentationValue(presentationElement, presentationType, presentationValue)과 같이 캡슐화 할 수있는 것은 presentationType == "CssClass" 인 경우 다른 함수 applyCssClass(presentationElement, value)을 호출합니다.

+0

"프레젠테이션"테이블에 연결하는 다른 컬럼이이 레이어를 생성합니까? 분리? – LittleTreeX

+0

@ LittleTreeX, 업데이트를 참조하십시오. – smartcaveman

+0

이 예제가 마음에 들어요.그러나이 특별한 경우에는 많은 여분의 작은 할당 표를 만들 것입니다 (응용 프로그램 전체에서이 이데올로기를 적용한다고 가정). 나는 이것에 관심을 가져야하고 조인과 여분의 테이블에 의해 성능이 저하됩니까? – LittleTreeX

4

클래스 자체는 실제로 프리젠 테이션 데이터가 아닙니다. 각 상태 유형의 레이블 일뿐입니다. 이론적으로 웹 페이지에 표시 될 때 상태가 어떤 색이어야하는지 결정하는 것 이외의 많은 작업에이를 사용할 수 있습니다.

해당 클래스를 주어진 스타일 집합과 결합하면 ,은 프레젠테이션 정보입니다. 그리고 당신은 데이터베이스가 아닌 CSS 파일에서 그렇게 할 것입니다.

그러나 데이터베이스의 상태가 변경되면 옵션 1에서 반드시 PHP 코드를 변경하지 않아도됩니다. PHP는 상태의 id 또는 name에서 클래스 이름을 생성 할 수 있습니다. 상태의 ID/이름이 변경 되었더라도 CSS를 변경해야하지만 그럴 가능성은 어느 정도입니까? 애플리케이션이 나타내는 데 필요한 상태가 변경되면 새로운 상태가 추가되어 각 상태가 일정하게 유지되지 않아야합니다.

1

DB에이를 저장하는 데 장단점이 있습니다. 분명히 거기에 클래스 정보를 가지고있는 것이 편리하지만 실제로 응용 프로그램의 일부는 아닙니다.

상태를 기반으로 처리하기 위해 프레젠테이션 계층에 저장하고 무언가를하지 않는 것이 좋습니다. 제 추리는 특히 유틸리티를 작성하고 있기 때문에 나중에 API가 사용되거나 무의미한 클래스를 통해 데이터가 사용될 수 있기 때문입니다.

3

데이터베이스에 css 클래스 정보를 저장할 수 있지만 많은 컨텐츠 관리 시스템이이를 수행하지만 상태를 클래스 이름의 일부로 만드는 것이 가장 좋습니다.

즉 상태 = 개방, 테이블 행을 생성하고 상태 _하기 위해 CSS 클래스를 설정 사용 PHP는 논리를 폐쇄 {이름} 다음 언제든지 당신은 추가 할 필요가 새 상태를 추가하거나 이름을 변경 /를 편집 CSS 파일, 아니 PHP를 레코딩이 필요합니다. 나는에 의해 받아

.status_open{background-color:green;}

.status_closed{background-color:red;}

관련 문제