복붙노트

[SQL] SQL Server에서 실제 일대일 관계를 만드는 방법

SQL

SQL Server에서 실제 일대일 관계를 만드는 방법

나는 외래 키 참조 테이블의 기본으로 I 세트 테이블의 기본 키, 두 개의 테이블 TableA의와 TableB의가 있습니다. 나는 데이터베이스 첫번째 엔티티 프레임 워크를 사용할 때,이 모델은 0..1 1입니다.

한 사람이 어떻게 SQL Server의 일대일 관계를 만들 수 있습니까?

해결법

  1. ==============================

    1.내가 그건 당신이 두 가지를 동시에 레코드를 삽입해야 의미로 확인이, SQL Server가 진정한 1 일에 관계를 가지고 기술적으로 불가능하다 꽤 있어요에, (그렇지 않으면 삽입에 대한 제약 조건 오류를 얻을 것) 두 테이블은 서로 외래 키 관계를 갖는 두 테이블.

    내가 그건 당신이 두 가지를 동시에 레코드를 삽입해야 의미로 확인이, SQL Server가 진정한 1 일에 관계를 가지고 기술적으로 불가능하다 꽤 있어요에, (그렇지 않으면 삽입에 대한 제약 조건 오류를 얻을 것) 두 테이블은 서로 외래 키 관계를 갖는 두 테이블.

    존재가 말했다, 외래 키 설명 데이터베이스 설계는 1 0..1에 관계이다. TableB의에서 레코드를 필요로 할 수없는 구속은 없습니다. 당신은 TableB의의 레코드를 생성하는 트리거와 의사 관계를 가질 수있다.

    몇 의사 솔루션이있다 그래서

    첫째, 단일 테이블의 모든 데이터를 저장합니다. 그럼 당신은 EF에는 문제가 없을 것입니다.

    또는 둘째, 당신의 기업은 연관된 기록을 가지고하지 않는 한 삽입을 허용하지하는 스마트 충분해야합니다.

    또는 셋째, 가장 가능성이, 당신은 당신이 해결하려고하는 문제가 있고, 솔루션 당신이 해결하려고하는 실제 문제 (XY로 문제) 대신 작동하지 않는 이유는 우리를 요청하고 있습니다.

    최신 정보

    1 일에 관계가 작동하지 않는 방법을 현실에 설명하기 위해, 나는 닭 또는 계란 딜레마의 비유를 사용합니다. 다음,이 딜레마를 해결하려고하지 않는다, 그러나 당신은 계란 테이블에 계란을 추가하기 위해서라는 제약 조건을 가지고 있다면, 치킨의 관계가 존재해야하며, 닭은 테이블에 있어야합니다 당신은 계란 테이블에 달걀을 추가 할 수 없습니다. 그 반대도 마찬가지입니다. 당신은 달걀의 관계와 계란 테이블에 존재하는 계란 두없이 닭 테이블에 치킨을 추가 할 수 없습니다. 따라서 레코드는 모든 규칙 / 제약 중 하나를 파괴하지 않고 데이터베이스에서 수행 할 수 없습니다.

    일대일 관계의 데이터베이스 명칭은 잘못된 것입니다. 내가 본 모든 관계는 (- 이물이 내 경험) 한 대 (0 또는 1) 관계로 더 설명 할 것이다.

  2. ==============================

    2.두 일차 키 필드에 대한 관계를 설정 한 후 기본 키와 외래 키를 설정하고. 즉입니다! 당신은 관계 라인의 양쪽 끝의 키 기호를 볼 수 있습니다. 이것은 하나에 하나를 나타냅니다.

    두 일차 키 필드에 대한 관계를 설정 한 후 기본 키와 외래 키를 설정하고. 즉입니다! 당신은 관계 라인의 양쪽 끝의 키 기호를 볼 수 있습니다. 이것은 하나에 하나를 나타냅니다.

    하나 하나의 관계와 SQL 서버 데이터베이스 디자인 :이 옵션을 선택합니다

  3. ==============================

    3.이 간단한 차 외래 키 관계를 만들고 다음과 같은 방식으로 독특한에 외래 키 열을 설정하여 수행 할 수 있습니다 :

    이 간단한 차 외래 키 관계를 만들고 다음과 같은 방식으로 독특한에 외래 키 열을 설정하여 수행 할 수 있습니다 :

    CREATE TABLE [Employee] (
        [ID]    INT PRIMARY KEY
    ,   [Name]  VARCHAR(50)
    );
    
    CREATE TABLE [Salary] (
        [EmployeeID]    INT UNIQUE NOT NULL
    ,   [SalaryAmount]  INT 
    );
    
    ALTER TABLE [Salary]
    ADD CONSTRAINT FK_Salary_Employee FOREIGN KEY([EmployeeID]) 
        REFERENCES [Employee]([ID]);
    

    INSERT INTO [Employee] (
        [ID]
    ,   [Name]
    )
    VALUES
        (1, 'Ram')
    ,   (2, 'Rahim')
    ,   (3, 'Pankaj')
    ,   (4, 'Mohan');
    
    INSERT INTO [Salary] (
        [EmployeeID]
    ,   [SalaryAmount]
    )
    VALUES
        (1, 2000)
    ,   (2, 3000)
    ,   (3, 2500)
    ,   (4, 3000);
    

    모든 것이 잘인지 확인

    SELECT * FROM [Employee];
    SELECT * FROM [Salary];
    

    지금은 일반적으로 (많은 한 가지) 1 차 대외 관계에서, 당신은 여러 번에 직원 ID를 입력 할 수 있습니다 그러나 여기에서 오류가 발생합니다

    INSERT INTO [Salary] (
        [EmployeeID]
    ,   [SalaryAmount]
    )
    VALUES
        (1, 3000);
    

    위의 문장은 같은 오류가 표시됩니다

  4. ==============================

    4.나는 하나 개의 작은주의와 함께, 트리거, 계산 된 열, 추가 테이블 또는 기타 '이국적인'트릭 (전용 외래 키와 고유 제한 조건)를 사용하지 않고 엄격하게 * 일대일 관계를 달성하는 방법을 알고있는 하나 개의 방법이있다.

    나는 하나 개의 작은주의와 함께, 트리거, 계산 된 열, 추가 테이블 또는 기타 '이국적인'트릭 (전용 외래 키와 고유 제한 조건)를 사용하지 않고 엄격하게 * 일대일 관계를 달성하는 방법을 알고있는 하나 개의 방법이있다.

    나는 나에게주의를 설명하는 데 도움이 허용 대답에서 닭이 - 더 - 달걀 개념을 빌려 것입니다.

    닭이나 달걀 하나가 (어쨌든 현재 데시벨에서) 먼저 와야한다는 사실이다. 다행히이 솔루션은 정치하지 않고 먼저 와야하는 규정하지 않는다 -는 구현에 그것을 떠난다.

    주의해야 할 점인지에 기록을 허용하는 테이블 기술적 다른 테이블에서 해당 레코드없이 생성 레코드를 가질 수있다 "제 온 '; 그러나,이 솔루션에 단 하나의 기록이 허용됩니다. 하나의 레코드 (만 닭고기와 계란)을 만들 때 '외로운'기록이 삭제되거나 일치하는 레코드가 다른 테이블에 작성 될 때까지, 더 이상 기록은 두 테이블 중 하나에 추가 할 수 없습니다.

    해결책:

    다른를 참조, 각 테이블에 외래 키를 추가하는 각 외래 키에 고유 제한 조건을 추가하고, 다른 널 (NULL)도 기본 키가 아닌 하나의 외래 키 널 (NULL)을합니다. 일이 들어, 널 (NULL) 컬럼에 고유 구속은 (이것은 SQL 서버, 확실하지에 대한 다른 데이터베이스에있는 경우입니다) 하나의 널 (null)을 허용해야합니다.

    CREATE TABLE dbo.Egg (
        ID int identity(1,1) not null,
        Chicken int null,
        CONSTRAINT [PK_Egg] PRIMARY KEY CLUSTERED ([ID] ASC) ON [PRIMARY]
    ) ON [PRIMARY]
    GO
    CREATE TABLE dbo.Chicken (
        Egg int not null,
        CONSTRAINT [PK_Chicken] PRIMARY KEY CLUSTERED ([Egg] ASC) ON [PRIMARY]
    ) ON [PRIMARY]
    GO
    ALTER TABLE dbo.Egg  WITH NOCHECK ADD  CONSTRAINT [FK_Egg_Chicken] FOREIGN KEY([Chicken]) REFERENCES [dbo].[Chicken] ([Egg])
    GO
    ALTER TABLE dbo.Chicken  WITH NOCHECK ADD  CONSTRAINT [FK_Chicken_Egg] FOREIGN KEY([Egg]) REFERENCES [dbo].[Egg] ([ID])
    GO
    ALTER TABLE dbo.Egg WITH NOCHECK ADD CONSTRAINT [UQ_Egg_Chicken] UNIQUE([Chicken])
    GO
    ALTER TABLE dbo.Chicken WITH NOCHECK ADD CONSTRAINT [UQ_Chicken_Egg] UNIQUE([Egg])
    GO
    

    먼저 달걀 (닭에 null에) 삽입해야합니다, 삽입합니다. 이제, 단지 닭 삽입 할 수 있습니다 그리고 그것은 '미 청구'계란을 참조해야합니다. 마지막으로, 추가 된 난자를 업데이트 할 수 있습니다 그리고 그것은 '미 청구'닭을 참조해야합니다. 어떤 시점에서 두 닭은 같은 계란 또는 그 반대를 참조 할 수있다.

    삭제하려면 같은 논리가 올 수 있습니다 : 업데이트 계란의 치킨을 null로, 계란을 삭제, 새로 '미 청구'닭을 삭제합니다.

    이 솔루션은 쉽게 교환 할 수 있습니다. 그것은 잠재적 인 실용성을 가지고 있기 때문에 흥미롭게도, 스와핑, 이러한 솔루션을 사용하기위한 가장 강력한 인수 될 수 있습니다. 일반적으로, 대부분의 경우, 두 테이블의 일대일 관계는 더 나은 단순히 하나에 두 개의 테이블을 리팩토링에 의해 구현된다; 아직도 한으로 유지하면서 그러나, 잠재적 인 시나리오에서, 두 테이블은 자주 교체 '파트너'에 진정으로 별개의 엄격한 일대일 관계를 요구하는 단체,하지만 필요성을 대표하거나 재 배열 일반적으로 할 수있다 재 배열 후에 온 관계. 보다 일반적인 솔루션이 사용 된 경우, 엔티티의 하나의 모든 데이터 열이 외부 키의 한 열이 있어야이 솔루션, 반대로, 모든 쌍은 재 배열 된 것에 대해 덮어 쓰기 / 업데이트해야 할 것입니다 재 배열 (Null 허용 외래 키 컬럼).

    음,이 (판단하지 않습니다 :) 어쩌면 누군가가 유용합니다 내가 표준 제약 조건을 사용하여 할 수있는 최선이다.

  5. ==============================

    5.SQL 1로 1 개 관계는 하나에 두 테이블의 필드를 병합하여 만들어집니다!

    SQL 1로 1 개 관계는 하나에 두 테이블의 필드를 병합하여 만들어집니다!

    난 당신이 한 일에 관하여 두 개체에 테이블을 분할 할 수 있습니다 알고 있습니다. 당신이 "테이블에서 이진 데이터를 많이 필드"에 게으른 로딩을 사용하고자하기 때문에 대부분의 경우이를 사용합니다.

    Exemple : 당신은 이름 열 (문자열), 어쩌면 일부 메타 데이터 열, 썸네일 열 및 그림 자체 VARBINARY (최대)로 사진을 포함하는 테이블이 있습니다. 응용 프로그램에서, 당신은 확실히 모음 컨트롤의 첫 번째 이름 만하고 썸네일을 표시하고 필요한 경우에만 "전체 그림 데이터"를로드합니다.

    그것은 당신이 찾고있는 경우. 그것은 "테이블 분할"또는 "수평 분할"라고 무언가이다.

    https://visualstudiomagazine.com/articles/2014/09/01/splitting-tables.aspx

  6. ==============================

    6.이를 위해 가장 쉬운 방법은 모두 표 A 만 1 테이블을 작성하고 B는 NULL을 NOT 필드. 그것은 불가능하다이 방법은 다른없이 하나를 가질 수 있습니다.

    이를 위해 가장 쉬운 방법은 모두 표 A 만 1 테이블을 작성하고 B는 NULL을 NOT 필드. 그것은 불가능하다이 방법은 다른없이 하나를 가질 수 있습니다.

  7. ==============================

    7.무엇에 대해?

    무엇에 대해?

    create table dbo.[Address]
    (
    Id int identity not null,
    City nvarchar(255) not null,
    Street nvarchar(255) not null,
    CONSTRAINT PK_Address PRIMARY KEY (Id)
    )
    
    create table dbo.[Person]
    (
    Id int identity not null,
    AddressId int not null,
    FirstName nvarchar(255) not null,
    LastName nvarchar(255) not null,
    CONSTRAINT PK_Person PRIMARY KEY (Id),
    CONSTRAINT FK_Person_Address FOREIGN KEY (AddressId) REFERENCES dbo.[Address] (Id)
    )
    
  8. ==============================

    8.일대일 관계가 매우 가능하다. 관계 다이어그램은 1-1 관계를 명시 적으로 표시되지 않는 경우에도 마찬가지입니다. 당신이 아래를 구현하는 경우, 그것은 하나 개의 관계에 하나의 기능을합니다.

    일대일 관계가 매우 가능하다. 관계 다이어그램은 1-1 관계를 명시 적으로 표시되지 않는 경우에도 마찬가지입니다. 당신이 아래를 구현하는 경우, 그것은 하나 개의 관계에 하나의 기능을합니다.

    나는 한 사람은 단 하나의 여권을 가질 수있는 개념을 설명하는 기본 예제를 사용합니다. 이 예는 MS Access에서 완벽하게 작동합니다. SQL 서버 버전에 대한 내용은이 링크를 따르십시오.

    순서대로 여기에 표시로 MS Access에서, SQL 스크립트를 한 번에 하나를 실행하지 될 수 있음을 기억하십시오.

    CREATE TABLE Person
    (
    Pk_Person_Id INT PRIMARY KEY,
    Name VARCHAR(255),
    EmailId VARCHAR(255),
    );
    
    CREATE TABLE PassportDetails
    (
    Pk_Passport_Id INT PRIMARY KEY,
    Passport_Number VARCHAR(255),
    Fk_Person_Id INT NOT NULL UNIQUE, 
    FOREIGN KEY(Fk_Person_Id) REFERENCES Person(Pk_Person_Id)
    );
    
  9. from https://stackoverflow.com/questions/10292355/how-to-create-a-real-one-to-one-relationship-in-sql-server by cc-by-sa and MIT license