2010-05-13 3 views
3

국가 목록이 있습니다. 각 사용자는 여러 국가를 확인할 수 있습니다. 일단 저장되면,이 "사용자 국가 목록"은 특정 사용자가 선택한 국가에 다른 사용자가 들어갈 수 있는지 여부를 확인하는 데 사용됩니다.단일 데이터베이스 셀당 여러 항목 저장

질문은 하나의 VARCHAR에서이 문제에 대한 가장 효율적인 방법 ... 내가 캐나다, 미국, 프랑스 등의 분리 된 목록으로 사용자 선택을 저장, 하나가

(최대) 될 것입니다 필드에 문제가 있지만 일단 독일 사용자가 페이지에 들어 오면이 확인을 수행해야합니다. 독일을 검색하려면 모든 항목을 가져오고 각 필드 값을 확인하거나 SQL을 'like'로 사용하는 것이 필요합니다.

더 나은 해결책이나 팁이 있다면 i 듣기 좋다.

단지 많은 사용자가 자신의 페이지를 방문 할 국가를 선택할 수 있습니다. 수백만 명의 사용자가 해당 페이지에 액세스합니다. 따라서 빠른 접근 방식이 더 좋을 것입니다.

기술, MSSQL 및 ASP.NET

감사

답변

10

당신은 하나 개의 셀에 값 목록을 저장해서는 안된다. 선택한 각 국가를 사용자 테이블에 대한 외래 키 참조와 함께 저장하는 별도의 테이블을 갖는 것을 고려하십시오. 이것은 표준 Database Normalization입니다.

는 하나 개의 필드에 여러 항목을 저장, 당신이 생각하고있는 경로를 아래로 이동하지 마십시오. 필자는 다른 이유로 인해 데이터베이스 디자인이 잘못되어 더 많은 응용 프로그램을 다시 작성해야했지만 이는 잘못된 디자인입니다. http://www.informationqualitysolutions.com/FreeStuff/rettigNormalizationPoster.pdf 내 전임자의

하나는 DB 디자인 초보자, 그리고이 그녀에게 많은 도움이 :

추가

나는 직장에서 내 벽에이 포스터를 가지고있다. 나는 그것을 필요로 할지도 모르는 새로운 고용을 위해 그것을 지킨다. 예제를 통해 정규화를 매우 잘 설명합니다.

+0

데이빗, 내가 생각하기에 처음에는 500 명의 사용자가 있지만 각 사용자에게는 적어도 2 가지 국가 목록의 변형이 있음을 알 수 있습니다. (국가, ID 및 이름) 각각 4 개국. 일부 사용자가 클릭 할 때마다 두 개의 큰 테이블을 검사해야 할 경우 Many-To-Many가 훨씬 더 빠른 접근 방법이 될 것입니까? 최선의 DB 최적화 관행은 many-to-many를 사용하는 것이지만, 너무 많은 최적화가 더 큰 문제를 만들 수있는 때라고 확신합니까? – eugeneK

+0

@eugeneK, 해당 값을 찾기 위해 문자열을 구문 분석하면 가장 느린 방법이 될 것입니다 –

+0

아니요 ... 많은 경우에 많은 사람들이 여전히이 경우에 갈 수 있습니다. @KM이 말했듯이, 그 값들을 파싱하는 것은 혼란 스러울 것이며, 여러 가지 이유로 더 큰 성능을 발휘할 것입니다. 단지 한 가지 이유로,이 필드를 기반으로 where 절을 필터링해야한다면, "like"를 사용하십시오. "="또는 더 나은 검색을 사용하는 것보다 훨씬 느립니다. 적절히 색인 된 필드에서 "="를 검색하십시오. – David

3

이 경우 UserID 및 CountryID를 저장하는 UserCountries (또는 일부)라는 테이블을 만들고 싶습니다. 이것은 표준 관계형 구조입니다. 초보자에게는 이상하고 너무 복잡하지만이 구조는이 유형의 데이터에 대해 유연한 쿼리를 작성하는 데 매우 쉽고 빠릅니다. 구분이 필요하지 않습니다!

+0

+1. 내 것과 같은 기본적인 대답과 멋지게 표현. – David

4

Do 데이터베이스에 구분 된 필드를 저장하십시오. 데이터베이스는 normalized이 아닙니다. 당신은 럼 식별자 필드를 사용하여 시작하는 경우

UserId 
CountryId 

, 당신은 (중 SQL 또는 코드에) 구문 분석 할 필요가 끝날 :

당신은 사용자와 국가 대다 테이블이 필요합니다. 쿼리하고 최적화하는 것이 더 어렵습니다.

+0

그리고 너에게 +1. – David

+0

감사합니다 Oded, 당신은 내가 David에게 준 동일한 대답을 가지고 있습니다. /// – eugeneK

+0

@eugeneK - 그 응답에 관해서 : 500 명의 사용자는별로 없습니다. SQL Server의 경우 수십만 개 이상이 많이 사용되기 시작했습니다. 한 가지 또는 다른 방법으로,이 질문에 대한 올바른 디자인입니다. – Oded

1

UserCountry 테이블에 대한 링크가 포함 된 UserCountry 테이블을 사용하는 것이 더 좋을 것이라고 생각합니다. 이렇게하면 데이터베이스에 대해 쿼리 할 수있는 더 많은 가능성이 생깁니다.이 방법은 훨씬 간단 예제 쿼리 : 사용자 당 나라의

+0

감사합니다. 당신은 내가 생각하지 못했던 좋은 점들을 만들었습니다 ... – eugeneK

0

는 보관하지 마십시오 여러 국가 A의

  • 정렬 모든 인기있는 국가 특정 국가를 선택 모든 사용자 단일 필드.

  • 관련 문제