2010-08-06 3 views
1

문서, 클라이언트, 사용자 및 회사 테이블을 사용하여 데이터베이스를 구축하는 경우 회사에서 소프트웨어를 사용하는 회사를 저장하는 위치에서 처음으로 세 개의 테이블을 설계하여 여러 회사를 지원하는 방법 그들에 저장? 따라서 Documents에서 우리는 모든 회사의 문서를 저장하고 싶습니다. 물론 우리는 appapp에 대해 어떻게 든 말할 필요가 있습니다. 따라서 FirmID와 같은 열이 필요합니다. 우리는 이것을 클라이언트와 사용자에 넣을 수도 있습니다.여러 클라이언트를 지원하기위한 데이터베이스 디자인

이제 다음 요구 사항은 우리가 새로운 회사를 추가 할 때 obviosuly, 자신이 만든 어떤을 위해 자신의 ID를 1

뭔가 생각에서 시작해야하기 때문에 각 기업이, 문서, 고객을위한 고유의 ID를 가질 수 있다는 것입니다 이처럼 RowID가 아닌 모든 필드를 수동으로 생성해야합니다.

CREATE TABLE [dbo].[ClientTest](
[RowID] [int] IDENTITY(1,1) NOT NULL, 
[FirmID] [int] NOT NULL, 
[ClientFirmID] [int] NOT NULL, 
[ClientFirmPrettyID] [varchar](10) NOT NULL, 
CONSTRAINT [PK_ClientTest] PRIMARY KEY CLUSTERED 
(
[RowID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

ROWID이 경우 자동으로 실행됩니다하지만 우리가하는 모든 일에 대해 우리가 ClientFirmID 및 ClientFirmPrettyID를 사용할 필요가 있기 때문에 우리에게 쓸모. 이 두 가지의 생성을 자동화하는 방법이 있습니까?

+0

다른 답변을 – garik

+0

에 추가했습니다. 이미지와 일부 코드가 추가되었습니다. – garik

+0

업데이트되었습니다. – garik

답변

1

데이터베이스 외관 패턴 (보기, 저장 프로 시저)을 사용하는 것이 좋습니다. 모든 데이터베이스 내부 (구조)를 다른 세계에서 숨기는 것이 좋습니다. 보안이 중요한 또 다른 포인트입니다. 모든 회사는 일부 테이블 수준의 데이터 (행 수준 아님) 두 번째 요점은 성능입니다. 하나의 큰 테이블보다 많은 테이블을 사용하는 것이 좋습니다.

CREATE view dbo.Client 
    as 
    SELECT ClientId= ClientId, FirmPrettyId = 'first' 
    FROM   dbo.FirstCompanyClient 
    UNION ALL 
    SELECT  ClientId = Client_Id, FirmPrettyId = 'second' 
    FROM      dbo.SecondCompanyClient 

또는

ADDED :

그래서 나는있는 그대로 모든 회사의 테이블을 떠나 보고서의 뷰 (내 생각)을 작성하는 것이 좋습니다 생각

alt text http://i34.tinypic.com/2yydonc.jpg

트리거 또는 저장 프로 시저를 사용하여 일부 회사 및 범위 ('클라이언트'또는 '클라이언트')에 대해 다음 ID를 생성하십시오. '문서') :

업데이트]
UPDATE dbo.zz_IdGenerator 
    SET 
     @nextId = NextId, 
     NextId = @nextId + 1 
    WHERE FirmId = @firmId and Scope = @scope 

    RETURN @nextId; 

: 저장 프로 시저에

삽입 UPDATE dbo.zz_IdGenerator... 및 문서 또는 클라이언트 테이블에 삽입하기 전에 호출합니다.

alt text http://i35.tinypic.com/dcro9g.jpg

+0

죄송합니다, 내가 작성한 내용의 절반을 이해하지 못합니다 .. – mare

+0

좋아,이게 좀 더 이해할 수있어. 이제 당신이 두 테이블에 당신의 견본을두고있는 것을 봅니다.그러나 나는 거기에 모든 이유가 있음에도 불구하고 두 개의 테이블을 원하지 않습니다. – mare

+0

안녕하십니까, 두 곳 이상의 회사간에 동일한 고객을 공유하는 것에 대해 어떻게 생각합니까? – garik

0

테이블 데이터를 처리하기 위해 PK-FK 관계를 적절하게 설정해야합니다. 예를 들어, 한 회사가 여러 개의 문서 (분명히 회사)를 가지고 있다면, DOcuments의 테이블에서 FirmID를 fk로 지정할 수 있습니다. 이는 Firm Table의 PK입니다. 또는 관계를 배우는 것이 매핑 작업입니다. 한 가지를해라. 테이블 사이의 관계없이 독립된 테이블을 생성하라. 4를 가지고 4 개의 테이블을 생성하면 사용자, 문서, 회사 및 클라이언트가됩니다. 이제 두 테이블의 관계를 처리 할 테이블을 하나 더 만듭니다. 예를 들어. Doc 및 Firm.

새 테이블 DocFirmMapTable에 3 개의 열 DocFirmMapId가 PK, DocId, FirmId로 지정되어 있습니다. 두 테이블에 삽입하는 동안 각각의 맵 테이블에 한 개 더 삽입해야 할 필요가 있습니다. 또한 맵 테이블에서 필요에 따라 두 개 이상의 테이블을 매핑 할 수 있습니다.

+0

이것은 하나 또는 여러 개의 관계에 대한 질문이 아닙니다. 나는 그것들을 안다. 이것은 일반 ID 자동 증가 열 이외의 특별한 순서 열에 관한 것입니다. – mare

1

FWIW, 의견

  • 당신이 당신의 "PrettyId"로 제안했듯이
  • (즉, 당신의 ROWID의 유지)를 가입의 uniquess에 대한 모든 테이블에 고유 대리 PK를 유지하는 것이 좋습니다겠습니까, 각 기업에 대한 문서, 고객 등의 고유 한 "시퀀스"는 PK가 아닙니다. 이를 위해 별도의 카운터 패턴이 필요합니다. 각 테이블에서 (* PrettyId, FirmId)에 고유 제한 조건을 적용 할 수도 있습니다.
  • 4NF 형식은 아니지만 보안 및 위생 목적으로 FirmId 외래 키를 에 모두 스탬프하는 것이 좋습니다. 회사 특정 테이블 (이유 : 시스템에서 발행 한 거의 모든 쿼리가 FirmId). 당신은 반드시이 필터링을 수행하는 (그리고 FirmId FK 모든 인덱스로 이동해야합니다 위해 다시 기업의 첫 번째 이웃에 가입 할 필요가 없습니다 때문에이 또한 성능 이점을 줄 것이다.

HTH에게

+0

이것은 합리적인 대답입니다. 모든 테이블에 자동 증가 PK를 유지하고 FirmID 열을 모두 FK로 설정합니다. 제가 배우고 자하는 부분은 시퀀스 또는 시퀀스 생성기입니다. – mare

1

기본 키의 목적은 유일하게, 테이블에서 행을 식별하기 위해 몇 가지 의미를 가질 수있는 비즈니스 키의 어떤 종류의 역할을하지 않습니다.

고객별로 맞춤 번호 매기기 순서가 필요한 경우 해당 열 (DocumentCustomId)을 추가 할 수 있습니다.

오라클, DB2, PostgreSQL에서 시퀀스 객체를 사용할 수 있습니다. SQL 서버에서는 사용자 정의 시퀀서를 작성해야하므로 DocumentSequence 테이블을 생성해야합니다. 테이블에 대한 액세스가 구현되어야 저장 프로 시저 (S)를 통해되어야

  • create_sequence
  • next_vale
  • CURRENT_VALUE
  • PREVIOUS_VALUE

새 문서를 삽입 상기 DocumentId 자동 증분, DocumentCustomId은 시퀀서 개체에서 next_value으로 얻어야합니다.

doc_model_v3

여기 Postgres이 개념에 도움이 Oracle, DB2 개체를 시퀀스 몇 가지 링크입니다.

+0

이것이 거의 이해할 수 있다고 생각하지만 SQL Server에서 시퀀싱을위한 샘플이 있습니까? – mare