ตามความเข้าใจของฉันของข้อกำหนดของสภาพแวดล้อมทางธุรกิจของคุณที่เกี่ยวข้องกับความคิดระดับความสัมพันธ์ 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.PersonId
Response.SurveyNumber
ที่สอง FK จะชี้ไปที่SurveyQuestion
PK ตารางเช่น(SurveyNumber, QuestionNumber)
และตามขึ้นของคอลัมน์และResponse.SurveyNumber
Response.QuestionNumber
ด้วยวิธีนี้Response.SurveyNumber
คอลัมน์ค่อนข้างมีประโยชน์เนื่องจากมันถูกใช้เป็นส่วนหนึ่งของการอ้างอิง FK ในข้อ จำกัด ที่แตกต่างกันสองข้อ
ด้วยวิธีนี้อย่างใดอย่างหนึ่งเพื่อให้แน่ใจว่าการจัดการฐานข้อมูลระบบการรับประกันการอ้างอิงจาก
- (ก)
Response
ไปPersonSurvey
;
- (ข)
Response
ไปSurveyQuestion
; และ
- (ค) แต่ละตารางที่เป็นตัวแทนของประเภทกิจการที่เชื่อมโยงไปยังตารางที่ยืนอยู่ประเภทองค์กรอิสระคือ
Person
, และSurvey
Question
ข้อมูลที่ได้มาเพื่อหลีกเลี่ยงการปรับปรุงความผิดปกติ
ฉันได้สังเกตุในแผนภาพของคุณองค์ประกอบสองอย่างที่ฉันเห็นคุณค่าน่าพูดถึง องค์ประกอบเหล่านี้เกี่ยวข้องกับสองPersonSurvey
คอลัมน์ที่สามารถ (ควร) จะได้มา
ในเรื่องนั้นคุณสามารถได้รับPersonSurvey.IsStarted
ข้อมูลโดยการสอบถามว่าPerson
เหตุการณ์ที่เกิดขึ้นได้ให้หนึ่งหรือมากกว่านั้นResponses
เพื่อQuestions
บูรณาการที่แน่นอนSurvey
ผ่านทางSurveyQuestion
ตาราง
และคุณยังสามารถหาPersonSurvey.IsCompleted
จุดข้อมูลได้ด้วยการพิจารณาว่าPerson
อินสแตนซ์ที่กำหนดได้มอบให้Response
กับทุกตัวQuestions
ที่เก็บค่า 'TRUE' ในIsMandatory
คอลัมน์ในSurveyQuestion
แถวที่ระบุ
จากการได้มาของค่าเหล่านี้คุณกำลังป้องกันความผิดปกติของการอัปเดตบางอย่างที่อาจเกิดขึ้นในที่สุดในกรณีที่คุณเก็บค่าดังกล่าวไว้ในSurveyQuestion
คอลัมน์
การพิจารณาที่สำคัญ
ตามที่@Daveชี้ให้เห็นอย่างถูกต้องในความคิดเห็นของเขาหากคุณเผชิญกับความต้องการในอนาคตที่ต้องการการจัดการการตอบสนองที่หลากหลายซึ่งบ่งบอกถึงการจัดการวันที่ค่าตัวเลขตัวเลือกที่หลากหลายและด้านอื่น ๆ ที่เป็นไปได้
ID
และNumber
อย่างอื่นนี่เป็นสิ่งที่มหัศจรรย์ ขอขอบคุณ.