2011-10-14 188 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

如果你问一个问题,请不要转储大量的代码,并问人们他们对它的看法。询问其他人会理解的具体问题。 –

+0

如果每个表都与核心对象相关,那么每个表中的特定字段没有任何问题。除此之外,我不知道该说什么...... – mellamokb

+0

谢谢,我想我问了一个具体的问题。问题是你如何看待像mellamokb这样的每个桌子上放置一个特定领域的问题。该代码仅供参考。 – hidden

回答

1

如果所有表中的MvrId表来自主键MvrId,你应该对所有MvrId列的外键约束。至少如果你想控制其他表中使用的MvrId

你还没有具体说明为什么你为所有这些表添加了MvrId,并且取决于你希望如何使用这些值,这可能是必要的,或者它可能是一个坏主意。

有必要的是,如果它添加一些关于存储实体的信息,那么如果可以使用与另一个表的关系来检索信息,则这是不必要的。

例如:MvrMedsPrescribingErrorsMvrMeds与FK MvrMedsId的子表。如果您可以使用MvrMedsIdMvrMedsPrescribingErrors找到关联MvrIdMvrMeds然后我不会MvrIdMvrMedsPrescribingErrors存储。

但如果在另一方面,你可以存储MvrId的在MvrMedsPrescribingErrors是不一样的相关MvrMedsMvrId那么它是完全必要的MvrIdMvrMedsPrescribingErrors

+0

事情是MvrId表单是在审查阶段创建的。有人填写表格并产生一个MvrId。然后一个月后有人评论MvrId并在记录中放入更多数据。所以,如果我把一个约束,它会迫使我在同一时间插入记录是吗? – hidden

+0

@jvelez - 不,你只需要确保你先向Mvr添加一行。 –

+0

好的,谢谢。您的意见帮助我开发出了更好的设计。 – hidden