ตามความเข้าใจของฉันของข้อกำหนดของสภาพแวดล้อมทางธุรกิจของคุณที่เกี่ยวข้องกับความคิดระดับความสัมพันธ์ ternary ในเรื่องนี้คุณต้องกำหนด:
- ความสัมพันธ์ (หรือสมาคม ) ประเภทระหว่างประเภทนิติบุคคลบุคคลและการสำรวจ ;
- ประเภทความสัมพันธ์ระหว่างการสำรวจและคำถาม ;
- ประเภทความสัมพันธ์ที่สร้างการเชื่อมต่อระหว่างสองประเภทความสัมพันธ์ดังกล่าวและเป็นผลระหว่างบุคคล , การสำรวจและคำถามคือการตอบสนอง (ชื่อที่สั้นลงที่ช่วยลดการตีความจากมุมมองของฉัน)
ดังนั้นฉันคิดว่าคุณอยู่ในแนวทางที่ถูกต้องกับแนวทางที่ 1แม้ว่าจะต้องมีการปรับแต่งเล็กน้อย (แต่สำคัญ) เพื่อให้แม่นยำยิ่งขึ้น ฉันจะดูรายละเอียดการปรับแต่งและข้อควรพิจารณาอื่น ๆ ที่เกี่ยวข้องในส่วนต่อไปนี้
กฎเกณฑ์ทางธุรกิจ
ให้เราขยายกฎเกณฑ์ทางธุรกิจที่เกี่ยวข้องเล็กน้อยและปรับโครงสร้างใหม่ด้วยวิธีต่อไปนี้:
- คนลงทะเบียนในศูนย์หนึ่งหรือหลายแบบสำรวจ
- การสำรวจได้รับการลงทะเบียนของบุคคลที่เป็นศูนย์หนึ่งหรือหลายคน
- การสำรวจนั้นรวมอยู่ในคำถามแบบหนึ่งต่อหลายคำถาม
- คำถามรวมศูนย์หนึ่งหรือหลายแบบสำรวจ
- คำถามที่ได้รับเป็นศูนย์หนึ่งหรือหลายคำตอบ
- การตอบสนองนั้นได้รับการจัดทำโดยบุคคลที่ถูกต้องหนึ่งคนในบริบทของการสำรวจที่แน่นอน
ไดอะแกรม IDEF1X ของที่เก็บข้อมูล
จากนั้นเราได้สร้าง IDEF1X แผนภาพที่นำเสนอในรูปที่ 1ซึ่งสังเคราะห์กฎเกณฑ์ทางธุรกิจสูตรข้างต้น:

 นิยามบูรณาการสำหรับแบบจำลองข้อมูล ( IDEF1X ) เป็นเทคนิคการสร้างแบบจำลองฝากฝังสูงที่ได้รับการยอมรับว่าเป็นมาตรฐานในเดือนธันวาคมปี 1993 โดยสหรัฐอเมริกาชาติสถาบันมาตรฐานและเทคโนโลยี ( NIST ) มันขึ้นอยู่กับการทำงานอย่างสมบูรณ์ทฤษฎีประพันธ์โดยผู้ก่อตั้ง แต่เพียงผู้เดียวของแบบเชิงสัมพันธ์คือดร. EF Coddและยังอยู่ในมุมมองนิติบุคคลความสัมพันธ์ที่พัฒนาโดยดร. พีพีเฉิน
PersonSurveyความสัมพันธ์
ที่ผมเห็นมันPersonSurveyความสัมพันธ์จะต้องให้ความหมายของการอนุมัติเพื่อให้คนสามารถมีส่วนร่วมในการที่ได้รับการสำรวจ ด้วยวิธีนี้เมื่อบางคนได้รับการจดทะเบียนในเฉพาะการสำรวจเขาหรือเธอเป็นผู้มีอำนาจที่จะให้คำตอบกับคำถามที่ว่าบูรณาการที่เกี่ยวข้องสำรวจ
แบบสำรวจความสัมพันธ์แบบสอบถาม
ฉันคิดว่าสถานที่ให้บริการ (หรือแอตทริบิวต์) เรียกว่าsuvery_question.question_numberในแผนภาพของคุณจะใช้เพื่อเป็นตัวแทนของการสั่งซื้อของการนำเสนอที่ได้รับคำถามเช่นด้วยความเคารพโดยเฉพาะอย่างยิ่งการสำรวจ อย่างที่คุณเห็นฉันได้แสดงคุณสมบัติเช่นSurveyQuestion.PresentationOrderและฉันคิดว่าคุณควรป้องกัน (i) คำถามสองข้อขึ้นไปคำถามจำนวนคำถามค่าส่วนแบ่ง (ii) ค่าPresentationOrderเดียวกันใน (iii) เหตุการณ์SurveyQuestionเดียวกัน
ในการวาดภาพที่ต้องการฉันได้รวมคีย์ ALTERNATE (AK) ประกอบในกล่องที่แสดงประเภทเอนทิตีนี้ซึ่งประกอบด้วยการรวมกันของคุณสมบัติ ( SurveyNumber, QuestionNumber, PresentationOrder ) ในขณะที่คุณทราบดีคอมโพสิต AK สามารถประกาศในการออกแบบ DDL ตรรกะด้วยความช่วยเหลือของข้อ จำกัด UNIQUE หลายคอลัมน์ (ตามที่ฉันเป็นแบบอย่างในSurveyQuestionตารางที่เป็นส่วนหนึ่งของเค้าโครง DDL expository expounded บางส่วนด้านล่าง)
ประเภทการตอบสนองของนิติบุคคล
ใช่ด้วยประเภทการตอบสนองฉันกำลังแสดงความสัมพันธ์ระหว่างความสัมพันธ์อื่นที่สอง ; มันอาจดูอึดอัดใจในครั้งแรก แต่ไม่มีอะไรผิดปกติกับวิธีการนี้ตราบใดที่มัน (a) แสดงถึงคุณลักษณะของบริบททางธุรกิจที่น่าสนใจอย่างถูกต้องและ (b) แสดงอย่างถูกต้องในรูปแบบตรรกะระดับ
ใช่คุณถูกต้องทั้งหมดมันจะเป็นข้อผิดพลาดในการพรรณนาว่าส่วนหนึ่งของสถานการณ์ในระดับตรรกะของนามธรรมโดยใช้ค่าสองResponse.SurveyNumber(หรือพูดResponse.SurveyId) ค่าที่อ้างอิงจากคอลัมน์ที่แตกต่างกันสองคอลัมน์ในResponseแถวเดียวกัน
รูปแบบ SQL-DDL เชิงตรรกะที่ได้รับมา
-- You should determine which are the most fitting 
-- data types and sizes for all your table columns 
-- depending on your business context characteristics.
-- As one would expect, you are free to make use of 
-- your preferred (or required) naming conventions.
CREATE TABLE Person (
    PersonId        INT      NOT NULL,
    FirstName       CHAR(30) NOT NULL,
    LastName        CHAR(30) NOT NULL,
    GenderCode      CHAR(3)  NOT NULL,
    BirthDate       DATE     NOT NULL,
    CreatedDateTime DATETIME NOT NULL,
    --
    CONSTRAINT Person_PK PRIMARY KEY (PersonId),
    CONSTRAINT Person_AK UNIQUE      (
        FirstName,
        LastName,
        GenderCode,
        BirthDate
    )
);
CREATE TABLE Survey (
    SurveyNumber    INT       NOT NULL,
    Description     CHAR(255) NOT NULL,
    CreatedDateTime DATETIME  NOT NULL,
    --
    CONSTRAINT Survey_PK PRIMARY KEY (SurveyNumber),
    CONSTRAINT Survey_AK UNIQUE      (Description)
);
CREATE TABLE PersonSurvey (
    PersonId           INT      NOT NULL,
    SurveyNumber       INT      NOT NULL,
    RegisteredDateTime DATETIME NOT NULL,
    --
    CONSTRAINT PersonSurvey_PK         PRIMARY KEY (PersonId, SurveyNumber),
    CONSTRAINT PersonSurveyToPerson_FK FOREIGN KEY (PersonId)
        REFERENCES Person (PersonId),
    CONSTRAINT PersonSurveyToSurvey_FK FOREIGN KEY (SurveyNumber)
        REFERENCES Survey (SurveyNumber)
);
CREATE TABLE Question (
    QuestionNumber  INT       NOT NULL,
    Wording         CHAR(255) NOT NULL,
    CreatedDateTime DATETIME  NOT NULL,
    --
    CONSTRAINT Question_PK PRIMARY KEY (QuestionNumber),
    CONSTRAINT Question_AK UNIQUE      (Wording)
);
CREATE TABLE SurveyQuestion (
    SurveyNumber       INT      NOT NULL,
    QuestionNumber     INT      NOT NULL,
    PresentationOrder  TINYINT  NOT NULL,
    IsMandatory        BIT      NOT NULL,
    IntegratedDateTime DATETIME NOT NULL,
    --
    CONSTRAINT SurveyQuestion_PK PRIMARY KEY (SurveyNumber, QuestionNumber),
    CONSTRAINT SurveyQuestion_AK UNIQUE      (
        QuestionNumber,
        SurveyNumber,
        PresentationOrder
    ),
    CONSTRAINT SurveyQuestionToSurvey_FK   FOREIGN KEY (SurveyNumber)
        REFERENCES Survey   (SurveyNumber),
    CONSTRAINT SurveyQuestionToQuestion_FK FOREIGN KEY (QuestionNumber)
        REFERENCES Question (QuestionNumber)
);
CREATE TABLE Response (
    SurveyNumber     INT      NOT NULL,
    QuestionNumber   INT      NOT NULL,
    PersonId         INT      NOT NULL,
    Content          TEXT     NOT NULL,
    ProvidedDateTime DATETIME NOT NULL,
    --
    CONSTRAINT Response_PK                 PRIMARY KEY (SurveyNumber, QuestionNumber, PersonId),
    CONSTRAINT ResponseToPersonSurvey_FK   FOREIGN KEY (PersonId, SurveyNumber)
        REFERENCES PersonSurvey   (PersonId, SurveyNumber),
    CONSTRAINT ResponseToSurveyQuestion_FK FOREIGN KEY (SurveyNumber, QuestionNumber)
        REFERENCES SurveyQuestion (SurveyNumber, QuestionNumber)
);
สองคีย์ผสมต่างประเทศในResponseตาราง
นี่อาจเป็นจุดที่สำคัญที่สุดในการพูดคุย: การอ้างอิงที่ทำจากResponseแถวที่ระบุไปยัง
- SurveyQuestion.SurveyNumberและ
- SurveyPerson.SurveyNumber
ต้องมีค่าที่ตรงกัน เท่าที่ฉันมีความกังวลตัวเลือกที่ดีที่สุดในการบังคับใช้เงื่อนไขนี้ในทางที่เปิดเผยคือการใช้คีย์ผสมสองตัวต่างประเทศ (FK)
ตามที่ปรากฏในการออกแบบ DDL ที่แรก FK คือการทำให้การอ้างอิงไปยังPersonSurveyตารางคีย์หลัก (PK) คือ(PersonId, SurveyNumber)และสอดคล้องตามคอลัมน์และResponse.PersonIdResponse.SurveyNumber
ที่สอง FK จะชี้ไปที่SurveyQuestionPK ตารางเช่น(SurveyNumber, QuestionNumber)และตามขึ้นของคอลัมน์และResponse.SurveyNumberResponse.QuestionNumber
ด้วยวิธีนี้Response.SurveyNumberคอลัมน์ค่อนข้างมีประโยชน์เนื่องจากมันถูกใช้เป็นส่วนหนึ่งของการอ้างอิง FK ในข้อ จำกัด ที่แตกต่างกันสองข้อ
ด้วยวิธีนี้อย่างใดอย่างหนึ่งเพื่อให้แน่ใจว่าการจัดการฐานข้อมูลระบบการรับประกันการอ้างอิงจาก
- (ก) ResponseไปPersonSurvey;
- (ข) ResponseไปSurveyQuestion; และ
- (ค) แต่ละตารางที่เป็นตัวแทนของประเภทกิจการที่เชื่อมโยงไปยังตารางที่ยืนอยู่ประเภทองค์กรอิสระคือPerson, และSurveyQuestion
ข้อมูลที่ได้มาเพื่อหลีกเลี่ยงการปรับปรุงความผิดปกติ
ฉันได้สังเกตุในแผนภาพของคุณองค์ประกอบสองอย่างที่ฉันเห็นคุณค่าน่าพูดถึง องค์ประกอบเหล่านี้เกี่ยวข้องกับสองPersonSurveyคอลัมน์ที่สามารถ (ควร) จะได้มา
ในเรื่องนั้นคุณสามารถได้รับPersonSurvey.IsStartedข้อมูลโดยการสอบถามว่าPersonเหตุการณ์ที่เกิดขึ้นได้ให้หนึ่งหรือมากกว่านั้นResponsesเพื่อQuestionsบูรณาการที่แน่นอนSurveyผ่านทางSurveyQuestionตาราง
และคุณยังสามารถหาPersonSurvey.IsCompletedจุดข้อมูลได้ด้วยการพิจารณาว่าPersonอินสแตนซ์ที่กำหนดได้มอบให้ResponseกับทุกตัวQuestionsที่เก็บค่า 'TRUE' ในIsMandatoryคอลัมน์ในSurveyQuestionแถวที่ระบุ
จากการได้มาของค่าเหล่านี้คุณกำลังป้องกันความผิดปกติของการอัปเดตบางอย่างที่อาจเกิดขึ้นในที่สุดในกรณีที่คุณเก็บค่าดังกล่าวไว้ในSurveyQuestionคอลัมน์
การพิจารณาที่สำคัญ
ตามที่@Daveชี้ให้เห็นอย่างถูกต้องในความคิดเห็นของเขาหากคุณเผชิญกับความต้องการในอนาคตที่ต้องการการจัดการการตอบสนองที่หลากหลายซึ่งบ่งบอกถึงการจัดการวันที่ค่าตัวเลขตัวเลือกที่หลากหลายและด้านอื่น ๆ ที่เป็นไปได้
               
              
IDและNumberอย่างอื่นนี่เป็นสิ่งที่มหัศจรรย์ ขอขอบคุณ.