2011-10-14 5 views
0

제 질문은 : 많은 테이블에 MvrId를 넣고 있음을 주목하십시오. 아래의 다음에 대한 귀하의 견해는 무엇입니까? 어떻게 개선 할 수 있습니까? 나에게 책을 가르키면 나는 희망을 품는다. enter image description here 전체 내용을 보려면 MedicalVariance라는 데이터베이스에서이 스크립트를 실행할 수 있습니다.데이터베이스 설계 SQL

USE MedicalVariance; 
    --This is a quick install script 
    --I guess you could even execute this from the front end but that would be overkill 
    --Because of the audience that will install this software are DBA's 

IF EXISTS 
(
--The query below will will evaluate to true if it finds a foreign key constraint. 
    SELECT 1 From INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
    WHERE CONSTRAINT_TYPE LIKE 'FOREIGN KEY' 
) 
BEGIN 
    DECLARE @TableName  NVARCHAR(100) 
    DECLARE @ConstraintName NVARCHAR(100) 
    DECLARE @DynamicSQLEXEC NVARCHAR(300) 
    --DECLARE AND FEED THE CURSOR DATA 
    Declare ConstraintCursor CURSOR FAST_FORWARD FOR 
    -- Dont worry I wont drop your precious FOREIGN KEYS since the catalog must be MedicalVariance 
    SELECT TABLE_NAME,CONSTRAINT_NAME 
    FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
    WHERE CONSTRAINT_TYPE LIKE 'FOREIGN KEY' 
      AND 
      CONSTRAINT_CATALOG LIKE 'MedicalVariance' 

    --OPEN THE CURSOR 
    OPEN ConstraintCursor 
    FETCH NEXT FROM ConstraintCursor 
    INTO @TableName, @ConstraintName 

    --NOW IMPLEMENT THE LOGIC TO DROP ALL CONSTRAINTS 
    WHILE @@FETCH_STATUS =0 
    BEGIN 

     --DYNAMIC SQL IS A PAIN IF YOU THINK YOU GOT BETTER SYNTAX GO FOR IT 
     SET @DynamicSQLEXEC ='ALTER TABLE '-- the space is important 
     SET @DynamicSQLEXEC [email protected] + @TableName + ' ' 
     SET @DynamicSQLEXEC [email protected] + 'DROP CONSTRAINT ' 
     SET @DynamicSQLEXEC [email protected] + @ConstraintName 
     PRINT @DynamicSQLEXEC -- make sure this is correct sql syntax 
     EXEC(@DynamicSQLEXEC) 
     -----------------------Dynamic SQL ENDS------------------------------------- 
     FETCH NEXT FROM ConstraintCursor 
     INTO @TableName, @ConstraintName 
    END; 
    CLOSE ConstraintCursor 
    DEALLOCATE ConstraintCursor 

END; 
GO 


IF EXISTS 
    (
      SELECT 1 FROM Information_Schema.Tables 
      WHERE Table_Name = 'MvrMeds' 
    ) 
      BEGIN 

       DROP TABLE MvrMeds 
      END; 
      GO 
IF EXISTS 
    (
      SELECT 1 FROM Information_Schema.Tables 
      WHERE Table_Name = 'Mvr' 
    ) 
      BEGIN 
       DROP TABLE dbo.Mvr 
      END; 
      GO 
IF EXISTS 
    (
      SELECT 1 FROM Information_Schema.Tables 
      WHERE Table_Name = 'MvrMedsAdminRoute' 
    ) 
      BEGIN 
       DROP TABLE dbo.MvrMedsAdminRoute 
      END; 
      GO 
IF EXISTS 
    (
      SELECT 1 FROM Information_Schema.Tables 
      WHERE Table_Name = 'MvrMedsPrescribingErrors' 
    ) 
      BEGIN 
       DROP TABLE dbo.MvrMedsPrescribingErrors 
      END; 
      GO 
IF EXISTS 
    (
      SELECT 1 FROM Information_Schema.Tables 
      WHERE Table_Name = 'MvrMedsTranscribingErrors' 
    ) 
      BEGIN 
       DROP TABLE dbo.MvrMedsTranscribingErrors 
      END; 
      GO 
IF EXISTS 
    (
      SELECT 1 FROM Information_Schema.Tables 
      WHERE Table_Name = 'MvrMedsProductIssuesErrors' 
    ) 
      BEGIN 
       DROP TABLE dbo.MvrMedsProductIssuesErrors 
      END; 
      GO 
IF EXISTS 
    (
      SELECT 1 FROM Information_Schema.Tables 
      WHERE Table_Name = 'MvrMedsProcumentErrors' 
    ) 
      BEGIN 
       DROP TABLE dbo.MvrMedsProcumentErrors 
      END; 
      GO 
IF EXISTS 
    (
      SELECT 1 FROM Information_Schema.Tables 
      WHERE Table_Name = 'MvrMedsDispensingErrors' 
    ) 
      BEGIN 
       DROP TABLE dbo.MvrMedsDispensingErrors 
      END; 
      GO 
IF EXISTS 
    (
      SELECT 1 FROM Information_Schema.Tables 
      WHERE Table_Name = 'MvrMedsAdministrationErrors' 
    ) 
      BEGIN 
       DROP TABLE dbo.MvrMedsAdministrationErrors 
      END; 
      GO 

    IF EXISTS 
    (
      SELECT 1 FROM Information_Schema.Tables 
      WHERE Table_Name = 'MvrMedsDocumentationErrors' 
    ) 
      BEGIN 
       DROP TABLE dbo.MvrMedsDocumentationErrors 
      END; 
      GO 

    IF EXISTS 
    (
      SELECT 1 FROM Information_Schema.Tables 
      WHERE Table_Name = 'MvrEmployees' 
    ) 
      BEGIN 
       DROP TABLE dbo.MvrEmployees 
      END; 
      GO   

    IF EXISTS 
    (
      SELECT 1 FROM Information_Schema.Tables 
      WHERE Table_Name = 'MvrCommunicationErrors' 
    ) 
      BEGIN 
       DROP TABLE dbo.MvrCommunicationErrors 
      END; 
      GO 
-- The way I am putting MvrId in almost every table 
-- Do you recommend it or bless it as good desing? 


CREATE TABLE Mvr 
(
    MvrId INT NOT NULL PRIMARY KEY 
) 
    CREATE TABLE MvrMedsAdminRoute 
(
    MvrMedsAdminRouteId INT NOT NULL PRIMARY KEY, 
    MvrId INT 
) 
CREATE TABLE MvrMeds 
( 
    MvrMedsId INT NOT NULL PRIMARY KEY, 
    MvrId INT , 
    MvrMedsAdminRouteId INT , 
    CONSTRAINT MvrMeds_Mvr_FK FOREIGN KEY(MvrId) REFERENCES dbo.Mvr(MvrID), 
    CONSTRAINT MvrMeds_MvrMedsAdminRoute_FK FOREIGN KEY (MvrMedsAdminRouteId) REFERENCES dbo.MvrMedsAdminRoute(MvrMedsAdminRouteId) 
) 

CREATE TABLE MvrMedsPrescribingErrors 
(
    MvrPrescribingErrorId INT NOT NULL PRIMARY KEY, 
    MvrMedsId  INT , 
    MvrId INT 
    CONSTRAINT MvrMedsPrescribingErrors_MvrMeds_FK FOREIGN KEY (MvrMedsId) REFERENCES dbo.MvrMeds(MvrMedsId) 
) 

CREATE TABLE MvrMedsTranscribingErrors 
(
    MvrTranscribingErrorsId INT NOT NULL PRIMARY KEY, 
    MvrMedsId INT , 
    MvrId INT 
    CONSTRAINT MvrMedsTranscribingErrors_MvrMeds_FK FOREIGN KEY (MvrMedsId) REFERENCES dbo.MvrMeds(MvrMedsId) 
) 
CREATE TABLE MvrMedsProductIssuesErrors 
(
    MvrTranscribingErrorsId INT NOT NULL PRIMARY KEY, 
    MvrMedsId INT , 
    MvrId INT 
    CONSTRAINT MvrMedsProductIssuesErrors_MvrMeds_FK FOREIGN KEY (MvrMedsId) REFERENCES dbo.MvrMeds(MvrMedsId) 
) 

CREATE TABLE MvrMedsProcumentErrors 
(
    MvrProcumentErrorsId INT NOT NULL PRIMARY KEY, 
    MvrMedsId INT, 
    MvrId INT 
    CONSTRAINT MvrMedsOrderingProcumentErrors_MvrMeds_FK FOREIGN KEY (MvrMedsId) REFERENCES dbo.MvrMeds(MvrMedsId) 
) 
CREATE TABLE MvrMedsDispensingErrors 
(
    MvrDispensingErrorsId INT NOT NULL PRIMARY KEY, 
    MvrMedsId INT, 
    MvrId INT 
    CONSTRAINT MvrMedsDispensingErrors_MvrMeds_FK FOREIGN KEY (MvrMedsId) REFERENCES dbo.MvrMeds(MvrMedsId) 
) 

CREATE TABLE MvrMedsAdministrationErrors 
(
    MvrAdministrationErrorsId INT NOT NULL PRIMARY KEY, 
    MvrMedsId INT, 
    MvrId INT 
    CONSTRAINT MvrMedsAdministrationErrors_MvrMeds_FK FOREIGN KEY (MvrMedsId) REFERENCES dbo.MvrMeds(MvrMedsId) 
) 

CREATE TABLE MvrMedsDocumentationErrors 
(
    MvrDocumentationErrorsId INT NOT NULL PRIMARY KEY, 
    MvrMedsId INT, 
    MvrId INT 
    CONSTRAINT MvrMedsDocumentationErrors_MvrMeds_FK FOREIGN KEY (MvrMedsId) REFERENCES dbo.MvrMeds(MvrMedsId) 
) 


----EMPLOYEES 
--ONLY EMPLOYEES CAN BE PART OF MVR? 
CREATE TABLE MvrEmployees 
(
    MvrEmployeesId INT PRIMARY KEY, 
    MvrId INT, 
    CONSTRAINT MvrEmployees_Mvr_FK FOREIGN KEY (MvrId) REFERENCES dbo.Mvr(MvrId) 
) 

CREATE TABLE MvrCommunicationErrors 
(
    MvrCommunicationErrorsId INT NOT NULL PRIMARY KEY, 
    MvrEmployeesId INT, 
    MvrId INT, 
    CONSTRAINT MvrCommunicationErrors_MvrEmployees_FK FOREIGN KEY (MvrEmployeesId) REFERENCES dbo.MvrEmployees(MvrEmployeesId) 
) 
+2

MvrId이 절대적으로 필요하므로 다른 한편으로는 동일하지 않습니다 MvrMedsPrescribingErrorsMvrId 년대를 저장할 수있는 경우 질문, 방대한 양의 코드를 버리고 사람들이 생각하는 것을 묻지 마십시오. 다른 사람들이 이해할 수있는 구체적인 질문을하십시오. –

+0

모든 테이블이 핵심 개체와 관련되어 있으면 모든 테이블의 특정 필드에 문제가 없습니다. 그 이상으로 나는 무엇을 말할 지 모르겠다. ... – mellamokb

+0

고맙다. 나는 특정 질문을했다. 문제는 mellamokb가 말한 것처럼 모든 테이블에 특정 필드를 넣는 것에 대해 어떻게 생각 하느냐입니다. 이 코드는 참고 용일뿐입니다. – hidden

답변

1

모든 테이블에서 MvrId 테이블 Mvr에 기본 키 MvrId에서 오는 경우 모든 MvrId 컬럼에 외래 키 제약 조건이 있어야합니다. 적어도 다른 테이블에서 MvrId이 사용되는 것을 제어하고 싶다면.

MvrId을 모든 테이블에 추가 한 이유를 지정하지 않았으며 값을 사용하는 방법에 따라 필요하거나 바람직하지 않을 수 있습니다.

저장되는 엔티티에 대한 정보를 추가하면 해당 정보를 다른 테이블과의 관계를 사용하여 검색 할 수 있으면 필요하지 않습니다.

예 : MvrMedsPrescribingErrors은 FK MvrMedsIdMvrMeds의 하위 테이블입니다. MvrMedsPrescribingErrorsMvrMedsId을 사용하면 에 연결된 MvrId을 찾을 수 있는데 MvrIdMvrMedsPrescribingErrors에 저장하지 않을 것입니다.

그러나 관련 MvrMeds 행의 MvrId 다음은 당신이 요청하는 경우 MvrMedsPrescribingErrors

+0

문제는 MvrId가 검토 단계에서 양식이 생성된다는 것입니다. 누군가 양식을 작성하면 MvrId가 생성됩니다. 그런 다음 한 달 후 누군가 MvrId를 검토하고 더 많은 데이터를 기록에 남깁니다. 그래서 제약 조건을 넣으면 동시에 레코드를 삽입해야합니다. – hidden

+0

@jvelez - 아니, 그냥 Mvr에 행을 추가해야합니다. –

+0

감사합니다. 귀하의 의견은 더 나은 디자인을 개발하는 데 도움이되었습니다. – hidden