문제

[업데이트] 이 질문에 대한 답변으로 선택한 접근 방식은 다음과 같습니다.

안녕,

이 주제에 대해 검색해 봤지만 실제로 원하는 것을 찾을 수 없습니다...

코드 테이블의 의미는 다음과 같습니다.'결혼 상태', 성별, 특정 법적 또는 사회적 상태와 같은 것...더 구체적으로 말하면 이러한 유형에는 속성만 설정되어 있으며 항목은 곧 변경되지 않습니다(그러나 변경될 수 있음).속성은 ID, 이름 및 설명입니다.

다음 기술에서 이러한 문제를 가장 잘 처리하는 방법이 궁금합니다.

  • 데이터베이스(여러 테이블, 코드 키가 다른 하나의 테이블...?)

  • 클래스 생성(아마도 ICode.Name 및 ICode.Description을 사용하여 ICode를 상속하는 것과 같은 것일 수 있음)

  • 이를 위한 뷰/발표자를 생성합니다:모든 항목을 포함하는 화면이 있어야 합니다. 즉, 유형 목록(성별, 결혼 상태...)과 값 목록의 각 항목에 대한 이름 및 설명이 포함된 해당 유형의 값 목록이 있어야 합니다.

이는 모든 단일 프로젝트에 나타나는 것이므로 이를 처리하는 방법에 대한 모범 사례가 있어야 합니다...

참고로 저는 이러한 상황에서 열거형을 사용하는 것을 별로 좋아하지 않습니다.여기서 그것들을 사용하는 것에 대한 어떤 논쟁도 환영합니다.

[후속 조치]

좋습니다. CodeToGlory와 Ahsteele로부터 좋은 답변을 받았습니다.이 질문을 구체화해 보겠습니다.

성별이나 결혼 여부에 대해 이야기하는 것이 아니라, 값은 확실히 변하지 않지만 이름과 설명만 있고 그 이상은 아닌 "물건"에 대해 이야기하고 있다고 가정해 보겠습니다.예를 들어:사회적 지위, 법적 지위.

UI:나는 이것을 위해 하나의 화면만을 원합니다.가능한 NameAndDescription 유형이 있는 목록 상자(그냥 그렇게 부르겠습니다), 선택한 NameAndDescription 유형에 대해 가능한 값이 있는 목록 상자, 선택한 NameAndDescription 유형 항목에 대한 이름 및 설명 필드.

View & Presenters에서는 이 문제를 어떻게 처리할 수 있나요?여기서 NameAndDescription 유형을 클래스 이름에서 추출해야 한다는 어려움이 있습니까?

DB:다중 조회 테이블과 단일 조회 테이블의 장단점은 무엇입니까?

도움이 되었습니까?

해결책 3

나는 다음과 같은 접근 방식을 사용하기로 결정했습니다.

CodeKeyManager mgr = new CodeKeyManager();
CodeKey maritalStatuses = mgr.ReadByCodeName(Code.MaritalStatus);

어디:

  • CodeKeyManager는 DB에서 CodeKeys를 검색할 수 있습니다(CodeKey=MaritalStatus).
  • Code는 문자열을 반환하는 상수로 채워진 클래스이므로 Code.MaritalStatus = "maritalStatus"입니다.이러한 상수는 CodeKey 테이블 > CodeKeyName에 매핑됩니다.
  • 데이터베이스에는 2개의 테이블이 있습니다.
    • ID가 있는 CodeKey, CodeKeyName
    • CodeKeyId, ValueName, ValueDescription이 포함된 CodeValue

DB:

대체 텍스트 http://lh3.ggpht.com/_cNmigBr3EkA/SeZnmHcgHZI/AAAAAAAAAAFU/2OTzmtMNqFw/codetables_1.JPG

수업 코드:

public class Code
{
    public const string Gender = "gender";
    public const string MaritalStatus = "maritalStatus";
}

클래스 코드키:

public class CodeKey
{
    public Guid Id { get; set; }
    public string CodeName { get; set; }

    public IList<CodeValue> CodeValues { get; set; }
}

클래스 코드값:

public class CodeValue
{
    public Guid Id { get; set; }

    public CodeKey Code { get; set; }

    public string Name { get; set; }
    public string Description { get; set; }

}

나는 지금까지 가장 쉽고 효율적인 방법을 찾았습니다.

  • 모든 코드 데이터는 동일한 방식으로 표시될 수 있습니다(동일한 보기/발표자에서).
  • 앞으로 나올 모든 코드 테이블에 대해 테이블과 클래스를 만들 필요가 없습니다.
  • 하지만 여전히 데이터베이스에서 쉽게 꺼내어 CodeKey 상수와 함께 쉽게 사용할 수 있습니다.
  • NHibernate는 이 문제도 쉽게 처리할 수 있습니다.

내가 아직 고려 중인 유일한 것은 GUID ID를 버리고 비즈니스 로직의 유용성을 위해 문자열(nchar) 코드를 사용하는 것입니다.

답변해주셔서 감사합니다!이 접근 방식에 대해 의견이 있으시면 그렇게 해주세요!

다른 팁

데이터베이스 구동 코드 테이블을 사용하는 것은 매우 유용 할 수 있습니다. 데이터 수명 정의 (시작 및 종료 날짜 사용)와 같은 작업을 수행하고 실시간으로 테이블에 데이터를 추가하여 코드를 배포 할 필요가 없으며 사용자가 허용 할 수 있습니다 (물론 올바른 권한을 사용하여). 관리 화면을 통해 데이터를 추가하십시오.

코드 나 설명보다는 항상 Autonumber 기본 키를 사용하는 것이 좋습니다. 이를 통해 여러 시간 동안 여러 코드 (동일한 이름이지만 다른 설명)를 사용할 수 있습니다. 또한 대부분의 DBA (내 경험에 따라)는 텍스트 기반 기본 키를 통해 자동 덤프를 사용합니다.

코딩 된 목록 당 단일 테이블을 사용합니다. 여러 코드를 하나의 테이블에 넣을 수 있지만 (매트릭스 사용) 지저분 해지고 유용한 몇 가지 상황 만 발견했습니다.

여기에 몇 가지 사항이 있습니다.

  1. 명시 적으로 명확하고 변하지 않는 열거를 사용하십시오. 예를 들어, 결혼 생활, 성별 등

  2. 위와 같이 고정되지 않은 품목에는 조회 테이블을 사용하여 시간이 지남에 따라 변경/증가/감소 할 수 있습니다.

데이터베이스에 조회 테이블이있는 것은 매우 일반적입니다. 비즈니스 계층에서 뷰/프레젠테이션으로 작동 할 수있는 키/값 객체를 정의하십시오.

나는이 유형의 데이터에 대한 테이블 표현을 사용하는 것에 의존합니다. 궁극적으로 데이터를 캡처 해야하는 경우 데이터를 저장해야합니다. 보고 목적을 위해서는 키를 통해 해당 데이터를 그릴 수있는 장소를 갖는 것이 좋습니다. 정규화 목적으로 단일 목적 조회 테이블이 다목적 조회 테이블보다 쉽다는 것을 알 수 있습니다.

그것은 열거가 성별처럼 변하지 않는 것들에 꽤 잘 작동한다고 말했다.

모든 사람이 코드 테이블을 복잡하게하려는 이유는 무엇입니까? 그렇습니다. 많은 것이 있지만 간단하므로 그렇게 유지하십시오. 그냥 다른 대상처럼 취급하십시오. 당신은 도메인의 일부이므로 도메인의 일부로 모델링하십시오. 불가피하게 더 많은 속성이나 기능이 필요하지 않은 경우 현재 사용하는 모든 코드를 취소하고 재 작업해야합니다.

물론 하나의 테이블 (참조 무결성 및보고 할 수 있도록).

"성별"객체를받는 메소드를 작성하면 실수로 "MarritalStatus"를 전달할 수 없기 때문에 수업의 경우 다시 한 번 수업에 대해 다시 한 번씩 수업에 대해 다시 한 번씩 수업을 진행합니다. 컴파일이 런타임 오류를 제거하는 데 도움이되므로 그 이유가 있습니다. 각 클래스는 단순히 Codetable 클래스 또는 무엇이든 상속하거나 포함 할 수 있지만 단순히 구현 도우미입니다.

UI의 경우, 실제로 상속 된 코팅 가능한 것을 사용하는 경우,이를 사용하여 하나의 UI로 유지할 수 있다고 생각합니다.

일반적으로 데이터베이스 모델을 엉망으로 만들지 말고 비즈니스 모델을 엉망으로 만들지 않지만 UI 모델에서 약간의 조이기는 그렇지 않습니다. 그렇게 나쁘지는 않습니다.

이 접근법을 더욱 단순화하는 것을 고려하고 싶습니다. 코드를 정의하는 3 개의 테이블 대신 (코드, 코드 키 및 코드 비평) 코드 유형과 코드 값을 모두 포함하는 하나의 테이블은 어떻습니까? 모든 코드 유형은 또 다른 코드 목록입니다.

아마도 다음과 같은 테이블 정의 일 것입니다.

CREATE TABLE [dbo].[Code](
    [CodeType] [int] NOT NULL,
    [Code] [int] NOT NULL,
    [CodeDescription] [nvarchar](40) NOT NULL,
    [CodeAbreviation] [nvarchar](10) NULL,
    [DateEffective] [datetime] NULL,
    [DateExpired] [datetime] NULL,
CONSTRAINT [PK_Code] PRIMARY KEY CLUSTERED 
(
    [CodeType] ASC,
    [Code] ASC
)
GO

CodeType = 0, CodeType의 유형을 나타내는 CodeType = 0 인 루트 레코드가있을 수 있습니다. 모든 CodeType 레코드에는 CodeType = 0이고 코드> = 1이 있습니다. 다음은 사물을 명확히하는 데 도움이 될 수있는 몇 가지 샘플 데이터입니다.

SELECT CodeType, Code, Description FROM Code

Results:

CodeType    Code    Description
--------    ----    -----------
0           0       Type
0           1       Gender
0           2       Hair Color
1           1       Male
1           2       Female
2           1       Blonde
2           2       Brunette
2           3       Redhead

유효한 코드 타입이 테이블에 입력되도록 코드 테이블에 확인 제한 조건을 추가 할 수 있습니다.

ALTER TABLE [dbo].[Code] WITH CHECK ADD CONSTRAINT [CK_Code_CodeType]   
CHECK (([dbo].[IsValidCodeType]([CodeType])=(1)))
GO

ISVALIDCODETYPE 기능은 다음과 같이 정의 될 수 있습니다.

CREATE FUNCTION [dbo].[IsValidCodeType]
(
    @Code INT
)
RETURNS BIT
AS
BEGIN
    DECLARE @Result BIT
    IF EXISTS(SELECT * FROM dbo.Code WHERE CodeType = 0 AND Code = @Code)
        SET @Result = 1
    ELSE
        SET @Result = 0
    RETURN @Result
END
GO

제기 된 한 가지 문제 중 하나는 코드 열이있는 테이블에 해당 코드 유형에 적합한 값이 있는지 확인하는 방법입니다. 이것은 함수를 사용하여 점검 제약으로 시행 될 수 있습니다.

다음은 성 칼럼이있는 사람 테이블입니다. 코드 유형 (이 예제의 성별)에 대한 설명과 함께 모든 코드 열을 이름을 지정하고 단어 코드를 사용하는 것이 모범 사례가 될 수 있습니다.

CREATE TABLE [dbo].[Person](   
    [PersonID] [int] IDENTITY(1,1) NOT NULL,
    [LastName] [nvarchar](40) NULL,
    [FirstName] [nvarchar](40) NULL,
    [GenderCode] [int] NULL,
CONSTRAINT [PK_Person] PRIMARY KEY CLUSTERED ([PersonID] ASC)
GO

ALTER TABLE [dbo].[Person] WITH CHECK ADD CONSTRAINT [CK_Person_GenderCode] 
CHECK (([dbo].[IsValidCode]('Gender',[Gendercode])=(1)))
GO

ISValidCode는 다음과 같은 방식으로 정의 될 수 있습니다.

CREATE FUNCTION [dbo].[IsValidCode]
(
    @CodeTypeDescription NVARCHAR(40),
    @Code INT
)
RETURNS BIT
AS
BEGIN
    DECLARE @CodeType INT
    DECLARE @Result BIT

    SELECT @CodeType = Code
    FROM dbo.Code
    WHERE CodeType = 0 AND CodeDescription = @CodeTypeDescription

    IF (@CodeType IS NULL)
    BEGIN
        SET @Result = 0
    END
    ELSE
    BEGiN
    IF EXISTS(SELECT * FROM dbo.Code WHERE CodeType = @CodeType AND Code = @Code)
        SET @Result = 1
    ELSE
        SET @Result = 0
    END

    RETURN @Result
END
GO

코드 열이있는 테이블을 쿼리 할 때 코드 설명을 제공하기 위해 다른 함수를 만들 수 있습니다. 다음은 개인 테이블을 쿼리하는 예입니다.

SELECT PersonID,
    LastName,
    FirstName,
    GetCodeDescription('Gender',GenderCode) AS Gender
FROM Person

이것은 모두 데이터베이스에서 조회 테이블의 확산을 방지하고 하나의 조회 테이블을 제공한다는 관점에서 고안되었습니다. 이 디자인이 실제로 잘 수행 될지 모르겠습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top