2011-10-14 2 views
0

Мой вопрос: обратите внимание, что я помещаю MvrId во многие таблицы. Каково ваше мнение о нижеследующем ниже. Как я могу улучшить его? Если вы укажете мне книгу, я надеюсь, что это страница книги. enter image description here Вы можете просто выполнить этот скрипт в базе данных MedicalVariance, если хотите увидеть все это.Database Design 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

Если вы спрашиваете вопрос, пожалуйста, не просто сбрасывайте огромное количество кода и спрашивайте людей, что они думают об этом. Задайте конкретные вопросы, которые поймут другие. –

+0

Нет ничего плохого в конкретном поле в каждой таблице, если каждая таблица связана с основным объектом. Кроме того, я не знаю, что сказать ... – mellamokb

+0

Спасибо, я думаю, я задал конкретный вопрос. Вопрос в том, что вы думаете о том, чтобы помещать определенную область на каждый стол, как сказал mellamokb. Код предназначен только для справки. – hidden

ответ

1

MvrId Если во всех таблицах происходят из первичного ключа в таблице MvrId вы должны иметь ограничение внешнего ключа на всех MvrId столбцов. По крайней мере, если вы хотите получить контроль над тем, что MvrId используется в других таблицах.

Вы не указали, почему вы добавили MvrId ко всей этой таблице, и в зависимости от того, как вы хотите использовать значения, это может быть необходимо или это может быть плохая идея.

Необходимо, если он добавляет некоторую информацию о сущности, в которой он хранится, нет необходимости, если эта информация может быть восстановлена ​​с использованием отношения к другой таблице.

Исход: MvrMedsPrescribingErrors является детским столом до MvrMeds с FK MvrMedsId. Если вы можете использовать MvrMedsId в MvrMedsPrescribingErrors, чтобы найти ассоциированный MvrId в MvrMeds, тогда я бы не стал хранить MvrId в MvrMedsPrescribingErrors.

Но если с другой стороны, вы можете хранить MvrId «S в MvrMedsPrescribingErrors, что это не то же самое, MvrId на соответствующий MvrMeds ряду, то это абсолютно необходимо иметь MvrId в MvrMedsPrescribingErrors

+0

Дело в том, что MvrId, что форма создается по этапам обзора. Кто-то заполняет форму и производит MvrId. Затем через месяц кто-то рассматривает этот MvrId и помещает больше данных в запись. Итак, если я поставлю ограничение, это заставит меня вставлять записи одновременно? – hidden

+0

@jvelez - нет, вам просто нужно убедиться, что сначала добавьте строку в Mvr. –

+0

Хорошо спасибо. Ваши комментарии помогли мне разработать лучший дизайн. – hidden