2012-10-16 3 views
2

다국어 웹 응용 프로그램을 개발 중이며 데이터베이스 (SQL Server 2008)에서 특정 시나리오를 처리하는 가장 좋은 방법을 결정하는 데 어려움을 겪고 있습니다.하나의 열만있는 테이블을 추가하는 것이 좋습니다 (자동 증가 ID)?

사용자가 소식을 추가 할 수 있다고 가정 해 보겠습니다. 게시물에는 기본 데이터와 지역화 된 데이터가 있습니다. 게시물은 정확히 하나의 카테고리와 연결됩니다. 또한 사용자는 이러한 지역화 된 카테고리를 관리 할 수 ​​있습니다.

게시물에 대한 부분은 나에게 분명합니다. 이것은 다음과 같습니다.

Posts 
----- 
PostId (auto incremented identity) 
CategoryId 
CreationDate 
SortOrder 

PostLocalizations 
----------------- 
PostId 
LanguageId 
Title 
Content 

문제는 기본 데이터가없는 것입니다. 이는 단지 텍스트 설명 일 뿐이며 현지화를 저장하는 가장 좋은 방법이 무엇인지 모릅니다.

나는 가능한 해결책을 생각할 수 있지만 정말 좋아하지 않습니다.

Categories 
---------- 
CategoryId (auto incremented identity) 

CategoryLocalizations 
--------------------- 
CategoryId 
LanguageId 
Name 

하나의 열만있는 테이블은 자동으로 증가하는 ID입니다. 물론 CreationDate 나 SortOrder와 같이 필요없는 더미 필드를 추가 할 수는 있지만 바보 같다.

이 문제를 해결하는 더 좋은 방법이 있습니까?

+0

첫 번째 문장에서 언급 한대로 SQL Server 2008 :-) –

+0

아니요, 2012입니다. 2008 does not – RichardTheKiwi

+0

적절한 지역화 된 값이 데이터베이스에없는 경우를 대비하여'Categories' 테이블에 대체/기본'Name'을 넣겠습니다. –

답변

0

순수 관계형 디자인에서 범주는 여기에 속성이되며 엔터티가 아닙니다. 테이블은 엔티티이고, 열은 속성입니다. 당신이 정말로 말하고있는 것은 CategoryLocalizations 엔티티 인스턴스가 유사한 "카테고리"를 가지고 있기 때문입니다. 책 그룹이 표지에 비슷한 "색상"을 갖는 것과 같습니다. 색상이 유한하고 범주가 지속적으로 구성된다는 점을 제외하고는 (따라서 신분).

이 차이는 오랫동안 확인되었으며 마침내 SQL Server 2012에 연결됩니다. 그러나 SQL Server 2008에서는 IDENTITY가 일반적으로 대용량 트랜잭션 테이블의 강력한 수단이되었습니다. 테이블이 매우 낮은 볼륨으로 보이기 때문에 간단히 구성 또는 일반 설정 테이블의 필드로 추가하고 가끔에 값이 필요할 때 업데이트합니다.

declare @CategoryID int; 
update config set @CategoryID = CategoryID = CategoryID + 1; 
+0

정교하게 주시겠습니까? –

0

바울의 제안은 적절합니다.

새로운 카테고리를 테이블에 삽입 할 때 어리석은 방법으로 트랜잭션 (+ 저장 프로 시저)을 사용하고 MAX (카테고리 ID) +1을 새 ID로 가져 왔습니다.

기존 범주의 새 언어를 추가하면 기존 범주 ID를 다시 사용하도록 회수합니다. 부주의 한 실수를 피하려면 UNIQUE KEY (CategoryId, LangaugeId)도 권장됩니다.

+0

하지만 게시물과 (이 경우) CategoryLocalizations 간의 FK 관계는 어떻습니까? 게시물의 CategoryId 필드는 CategoryLocalizations의 여러 항목을 가리 킵니다. –

관련 문제