Phương pháp mô hình hóa dữ liệu tốt nhất để xử lý các khóa ngoại thừa trong cơ sở dữ liệu về Khảo sát, Câu hỏi và Phản hồi


13

Tôi đang tìm kiếm lời khuyên về phương pháp mô hình quan hệ tốt nhất để lưu trữ các khảo sát, câu hỏi và câu trả lời.

Tôi đang tìm kiếm cách tiếp cận nào trong hai cách dưới đây có vẻ tốt nhất hoặc cách tiếp cận khác.

Tôi có ít nhất những thực thể này:

  • câu hỏi
  • khảo sát
  • người

Và ít nhất là những mối quan hệ này:

  • Mỗi khảo sát có 1 hoặc nhiều câu hỏi.
  • Mỗi câu hỏi có thể được sử dụng trong 0 hoặc nhiều khảo sát.
  • Mỗi người có thể thực hiện 0 hoặc nhiều khảo sát.

Đây là nơi tôi gặp rắc rối: làm thế nào để mô hình hóa các câu trả lời cho các câu hỏi khảo sát được thực hiện bởi một người.

Đây là hai cách tiếp cận tôi đã xem xét, cả hai cách này đều không tốt cho tôi. Các sơ đồ ở đây được đơn giản hóa rất nhiều để minh họa vấn đề.

Cách tiếp cận 1: Cách tiếp cận 1

Những gì tôi không thích về cách tiếp cận này:

  • Các survey_person_question_responsebảng có hai cột khác nhau mà tham khảo một cuộc khảo sát: survey_question_survey_idsurvey_person_survey_id
    • Sẽ là một lỗi khi có các survey_idtham chiếu khác nhau trong một hàng cho hai cột này. Survey_question phải từ cùng một khảo sát như người đã thực hiện trong Survey_person. Tôi không thể thấy một cách tốt để thực thi điều này.
  • Có vẻ như những gì tôi đang làm ở đây là tạo mối quan hệ giữa hai mối quan hệ. Điều đó cảm thấy sai đối với tôi vì một số lý do.

Cách tiếp cận 2:

Cố gắng tránh hai FK từ cách tiếp cận 1 nên tham chiếu đến cùng một giá trị ... nhập mô tả hình ảnh ở đây

Những gì tôi không thích về cách tiếp cận này:

  • Không có sự thực thi nào cho thấy question_idsurvey_idFK là từ một survey_questioncặp hợp lệ
  • Không có sự thực thi nào cho thấy survey_idperson_idFK là từ một survey_personcặp hợp lệ

Mọi lời khuyên về:

  • Liệu một trong những cách tiếp cận này là một cách tiếp cận điển hình
  • Những ưu và nhược điểm của một trong những cách tiếp cận này so với cách tiếp cận khác
  • Cách tốt hơn để sắp xếp dữ liệu này hoàn toàn

Sẽ được đánh giá rất cao!

Câu trả lời:


12

Theo hiểu biết của tôi về thông số kỹ thuật của bạn, môi trường kinh doanh của bạn liên quan đến một mối quan hệ ternary cấp khái niệm . Về vấn đề này, bạn cần xác định:

  1. loại mối quan hệ (hoặc liên kết ) giữa các loại thực thể PersonSurvey ;
  2. loại mối quan hệ giữa Khảo sátCâu hỏi ;
  3. loại mối quan hệ thiết lập kết nối giữa hai loại mối quan hệ nói trên và, do đó, giữa Người , Khảo sátCâu hỏi , tức là Phản hồi (một tên ngắn hơn giúp đơn giản hóa việc giải thích, theo quan điểm của tôi).

Vì vậy, tôi cho rằng bạn đang đi đúng hướng với Cách tiếp cận 1 của mình , mặc dù nó đòi hỏi một số tinh chỉnh nhỏ (nhưng quan trọng) để làm cho nó chính xác hơn. Tôi sẽ trình bày chi tiết các sàng lọc như vậy và các cân nhắc liên quan khác trong các phần sau.

Quy tắc kinh doanh

Hãy để chúng tôi mở rộng các quy tắc kinh doanh áp dụng một chút và cải tổ chúng theo cách sau:

  • Một người đăng ký trong các cuộc khảo sát không có một hoặc nhiều
  • Một cuộc khảo sát có được đăng ký của những người không có một hoặc nhiều người
  • Một khảo sát được tích hợp bởi nhiều câu hỏi
  • Một câu hỏi tích hợp zero-một-hoặc-nhiều Khảo sát
  • Một câu hỏi nhận zero-một-hoặc-nhiều Responses
  • Một đáp ứng được cung cấp bởi chính xác-one Person trong bối cảnh chính xác-one Khảo sát

Sơ đồ IDEF1X tiếp xúc

Sau đó, tôi đã tạo cho IDEF1X một sơ đồ được trình bày trong Hình 1 , tổng hợp các quy tắc kinh doanh được xây dựng ở trên:

Hình 1 Khảo sát đơn giản IDEF1X


một Integration Definition Thông tin Modeling ( IDEF1X ) là một kỹ thuật xây dựng mô hình đánh giá cao recommendable đã được thành lập như là một tiêu chuẩn trong tháng 12 năm 1993 do Viện Quốc gia Hoa Kỳ Tiêu chuẩn và Công nghệ ( NIST ). Nó hoàn toàn dựa trên công trình lý thuyết được sáng lập bởi người sáng lập duy nhất của mô hình quan hệ , tức là Tiến sĩ EF Codd và cũng dựa trên quan điểm về mối quan hệ thực thể được phát triển bởi Tiến sĩ PP Chen .


Các PersonSurvey mối quan hệ

Như tôi thấy, mối quan hệ PersonSurvey được yêu cầu cung cấp một phương tiện ủy quyền để một Người có thể tham gia vào một Khảo sát nhất định . Theo cách này, một khi một Người nào đó đã được đăng ký trong một Khảo sát cụ thể , người đó được ủy quyền để cung cấp Phản hồi cho các Câu hỏi tích hợp Khảo sát tương ứng .

Các SurveyQuestion mối quan hệ

Tôi giả sử rằng thuộc tính (hoặc thuộc tính) được gọi là suvery_question.question_number trong sơ đồ của bạn được sử dụng để thể hiện Thứ tự trình bày của một thể hiện Câu hỏi nhất định đối với một Khảo sát cụ thể . Như bạn có thể thấy, tôi đã ký hiệu các thuộc tính như SurveyQuestion.PftimeationOrder và tôi nghĩ rằng bạn nên ngăn chặn (i) hai hoặc nhiều câu hỏi. Các giá trị củaQuestionNumber chia sẻ (ii) cùng một giá trị PresentationOrder trong (iii) cùng một sự kiện SurveyQuestion .

Để miêu tả nhu cầu đó, tôi đã bao gồm một ALTERNATE KEY (AK) tổng hợp trong hộp đại diện cho loại thực thể này, bao gồm sự kết hợp của các thuộc tính ( SurveyNumber, questionNumber, PresentationOrder ). Như bạn đã biết, một AK tổng hợp có thể được khai báo trong thiết kế DDL hợp lý với sự trợ giúp của một ràng buộc UNIITE nhiều cột (như tôi đã minh họa trong SurveyQuestionbảng là một phần của bố cục DDL giải trình bày một vài phần bên dưới).

Các phản ứng loại thực thể

Có, với Phản hồi loại thực thể tôi đang mô tả mối quan hệ giữa hai mối quan hệ khác ; nó có thể có vẻ vụng về ở cái nhìn đầu tiên nhưng không có gì là sai với cách tiếp cận này, miễn là nó (a) đại diện cho các tính năng của bối cảnh kinh doanh quan tâm một cách chính xác và (b) được thể hiện đúng trong một bố cục logic cấp.

Vâng, bạn hoàn toàn chính xác, sẽ là một lỗi khi mô tả một phần của kịch bản ở mức độ trừu tượng logic bằng hai Response.SurveyNumberResponse.SurveyId giá trị (hoặc, giả sử ) được tham chiếu từ hai cột khác nhau trong cùng một Responsehàng.

Bố cục SQL-DDL hợp lý

-- 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)
);

Hai phím NGOẠI TỆ tổng hợp trong Responsebảng

Đây có lẽ là điểm quan trọng nhất để thảo luận: các tài liệu tham khảo được thực hiện từ một Response hàng để

  1. SurveyQuestion.SurveyNumber
  2. SurveyPerson.SurveyNumber

phải có giá trị khớp . Theo tôi thấy, lựa chọn tốt nhất để thực thi điều kiện này theo cách khai báo là sử dụng hai phím NGOẠI TỪ (FK) tổng hợp.

Như được thể hiện trong thiết kế DDL, FK đầu tiên đang tạo tham chiếu đến PersonSurveybảng PRIMARY KEY (PK), nghĩa là (PersonId, SurveyNumber), và được tuân thủ bởi các cột Response.PersonIdResponse.SurveyNumber.

FK thứ hai đang chỉ vào SurveyQuestionbảng PK, nghĩa là (SurveyNumber, QuestionNumber), và, theo đó, được tạo thành từ các cột Response.SurveyNumberResponse.QuestionNumber.

Theo cách này, Response.SurveyNumbercột khá công cụ vì nó được sử dụng như một phần của tham chiếu FK theo hai ràng buộc khác nhau.

Với phương pháp này, người ta đảm bảo hệ thống quản lý cơ sở dữ liệu được đảm bảo tính toàn vẹn tham chiếu từ

  • (a) Response đến PersonSurvey;
  • (b) Response đến SurveyQuestion; và
  • (c) mỗi bảng đại diện cho một loại thực thể kết hợp các bảng đứng với nhiều loại thực thể độc lập, cụ thể là Person, SurveyQuestion.

Dữ liệu được tạo ra để tránh cập nhật sự bất thường

Tôi đã nhận thấy trong sơ đồ của bạn hai yếu tố mà tôi đánh giá cao là đáng nói. Các yếu tố này có liên quan đến hai PersonSurveycột có thể (nên) dẫn xuất .

Về vấn đề đó, bạn có thể lấy được PersonSurvey.IsStarteddữ liệu bằng cách truy vấn nếu một Personsự kiện nhất định đã cung cấp một hoặc nhiều hơn Responsesđể Questionstích hợp chính xác Surveythông qua SurveyQuestionbảng.

Và bạn cũng có thể có được PersonSurvey.IsCompletedđiểm dữ liệu bằng cách xác định xem một Persontrường hợp cụ thể có cung cấp Responsecho tất cả các Questionsgiá trị đó có giá trị 'TRUE' trong IsMandatorycột trong một SurveyQuestionhàng cụ thể hay không .

Bằng cách lấy đạo hàm của các giá trị này, bạn đang ngăn chặn một số bất thường cập nhật cuối cùng sẽ phát sinh trong trường hợp bạn giữ các giá trị đó trong SurveyQuestioncột.

Cân nhắc quan trọng

Như @Dave đã chỉ ra một cách đúng đắn trong nhận xét của mình, nếu bạn phải đối mặt với yêu cầu trong tương lai yêu cầu quản lý các loại phản hồi khác nhau có nghĩa là quản lý ngày, giá trị số, nhiều lựa chọn và các khía cạnh có thể khác, bạn sẽ phải mở rộng bố cục cơ sở dữ liệu này.


1
Wow, điều này đã trả lời hoàn hảo câu hỏi trong đầu và sau đó dạy tôi nhiều hơn! Vì các bình luận nên đề xuất cải tiến: Hơi khó hiểu khi các khóa kết thúc bằng cả hai IDNumber, nhưng nếu không thì điều này thật tuyệt vời. Cảm ơn bạn.
Zach Mierzejewski

@Zach Bạn được chào đón nhất, tôi rất vui vì bài viết đã giúp bạn. Cảm ơn phản hồi, một số tinh chỉnh được quyết định kêu gọi.
MDCCL

1

Đây là một lý do tại sao tôi không muốn tiền tố cột khi di chuyển chúng dưới dạng khóa ngoại. Trong trường hợp đầu tiên của bạn, công cụ lập mô hình có thể buộc bạn phải thêm tiền tố vào một trong các survey_idcột trongsurvey_person_question_response bảng. Bạn có thể điều chỉnh điều này sau khi mối quan hệ được thực hiện.

Nếu cần, hãy xóa trường id khảo sát dự phòng khi bạn xây dựng mô hình vật lý nơi bạn không cần cột trùng lặp. Như bạn đã xác định, cả hai mô hình của bạn đều có vấn đề, nhưng tôi tin rằng mô hình đầu tiên có tổng thể tốt hơn.


Cảm ơn về cái nhìn sâu sắc - Tôi đã thu gọn xuống 1 cột trong mô hình vật lý thực thi mọi thứ tôi muốn.
deadcode
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.