2011-11-22 4 views
0

예를 들어, 직원 목록이있는 테이블이 있다고 가정합니다. 직원 ID가 기본 키이며 이름, 나이 등 직원의 다른 세부 정보가 있습니다. 직원이 여러 전화 번호를 가질 수 있습니다. 따라서 다중 값 속성이됩니다. 직원들이 보유한 전화 (연락처)의 수를 알 수 없습니다. 여러 값을 갖는 열이있는 sqlite 테이블을 만들 수 있습니까?

그것은 가능 sqlite3를의 속성을 다중했다고? 또는이를 수용 할 수있는 방법이 있습니까?

감사합니다.

답변

2

당신은 다음과 같은 아이디어로이 작업을 수행 할 수 있습니다

  1. 모든 전화 번호를 저장 한 열 생성 (숫자를 기반으로 쿼리하게 어려운, 권장하지 않음) 각 번호에 대한 X의 열을 생성 할 수 있습니다
  2. (PHONE1는 phone2는 ...) (당신은 당신이 전화 번호에 대해 별도의 테이블을 만들고 foreign key와 직원 테이블과이 테이블을 연결할 수 있습니다
  3. 각 사용자에 대한 전화 번호)의 최대 수있을거야 무엇을 결정해야합니다. 이렇게하면 각 직원에 대한 다양한 전화 번호 목록을 저장할 수 있습니다 (새 테이블이 필요함).

옵션 3이 가장 유연한 것처럼 보이지만 대부분의 경우 옵션 2가 구현 된 것으로 나타났습니다 (일반적으로 사람들은 전화 번호 수가 제한적입니다).

+1

옵션 3만이 유일한 합리적인 솔루션입니다. 다른 것들은 데이터베이스의 정규화 원칙에 위배되며 결과적인 프로그래밍을 더 어렵게 만들 것입니다. –

+0

여기 래리 (Larry)의 조언을 따라야합니다. 데이터베이스 스키마를 변경하거나 다른 사람을 설득 할 수없는 경우 코딩 솔루션을 사용하여 문제를 해결하는 것을 환영합니다. 그러나 진지하게 래리에게 귀를 기울이십시오. – Dubs

+0

의견을 주셔서 감사합니다. 예, 스키마 정규화 측면에서 옵션 3이 가장 좋습니다. 그러나 전화 번호의 경우 사람들이 1 또는 2 개의 번호를 갖고 있으며 많은 시스템이 그 전화 번호 만 처리하도록 설계되어있는 것이 일반적입니다. 또한 질의를 단순화하고 일종의 시스템에서 중요한 조인을 피합니다. – dzida

0

여러 개의 연락처 번호를 저장하는 직렬화 가능 사용자 정의 클래스를 만들 수도 있습니다. 그런 다음 사용자 정의 클래스를 byte []로 직렬화 한 다음 byte []에서 ASCII 문자열을 추출 할 수 있습니다. 여러 연락 전화 번호의 문자열을 저장할 수 있습니다,하지만 당신은 데이터베이스에서 다시 읽은 후 데이터를 역 직렬화해야합니다 (아래의 과정을 반대로.)

public class Contacts : ISerializable 
{ 
} 

if (Contacts is ISerializable) 
{ 
    string contactNumbers = String.Empty; 

    using (var stream = new MemoryStream()) 
    { 
     var formatter = new BinaryFormatter(); 
     formatter.Serialize(stream, Contacts); 
     stream.Close(); 
     var bytes = stream.GetBuffer(); 
     contactNumbers = System.Text.Encoding.ASCII.GetString(bytes)); 
    } 

    //Perform the update for this column or add to your insert query. 
} 
0

이의 잘못된 접근입니다 관계형 데이터베이스 용어. 대신 직원 전화 번호를 보관할 별도의 테이블을 만들어야합니다. 테이블에는 employee_id 및 phone_number 열이 있습니다. 각 직원은 보유하고있는 전화 번호 수에 따라이 테이블에 0 개 이상의 레코드가있을 수 있습니다. 각 전화 번호가 무엇인지에 대한 정보를 가질 수 있도록

는 또한 설명 열을 포함 할 수 있습니다. 단일 열에서 여러 값을 저장

관계형 데이터베이스에 아뇨 일차 없다. 제발 하지마. 이 "정상적인 형태"의 부족을 같이

0

다중 값 필드는 DB 설계에 아주 나쁜 관행으로 간주됩니다. 대신 다음을 수행해야합니다.

  1. 3 개의 열로 새 EmployeePhoneNumber 테이블을 만듭니다. EmployeePhoneNumberId, EmployeeId, PhoneNumber 및 PhoneType입니다.
  2. 유형 열을 (Mobile, Home ..) 중 하나로 제한하는 제약 조건을 추가하십시오.

이제 유형에 따라 원하는 전화 번호를 새 테이블에 추가 할 수 있습니다. 필요한 경우 employeeId로 쿼리하고 입력하십시오.

이 옵션뿐만 아니라 더 유연하지만 실제로 존재하는 전화 번호에 대한 스토리지를 할당합니다대로 DB 저장 크기를 저장합니다.

관련 문제