programing

PHP와 MySQL을 이용한 Quiz 웹 어플리케이션 개발을 위한 데이터베이스 설계

css3 2023. 10. 7. 12:06

PHP와 MySQL을 이용한 Quiz 웹 어플리케이션 개발을 위한 데이터베이스 설계

그래서 저는 PHP와 MySQL을 배우려고 노력하고 있습니다. (두 가지 모두에 대한 기본적인 이해가 있습니다. Head First SQL과 Head First PHP & MySQL의 전반부를 모두 읽었습니다.) 제 지식을 공고히 하는 가장 좋은 방법은 읽는 것보다 무언가를 구축하는 것이라고 생각합니다.

이 점을 고려하여 서버의 MySQL 데이터베이스에 연결되는 기본 웹페이지를 작성하고자 합니다.기본 HTML 양식을 만들고 사용자가 last_name, first_name, e-메일, birthday, gender 등의 기본 정보를 입력할 수 있도록 하겠습니다.

문제는 기본적인 퀴즈의 결과를 기록할 데이터베이스를 설계하는 방법을 모른다는 것입니다. 객관식 문제 5개만 원합니다.결국 사용자의 결과와 이전 사용자의 결과를 보여주고 싶습니다.

5문항 퀴즈의 표를 디자인하는 방법을 이해해 주시면 감사하겠습니다.감사합니다!

먼저 4개의 간단한 테이블부터 시작하겠습니다.

사용자

- user_id        auto integer
- regtime        datetime
- username       varchar
- useremail      varchar
- userpass       varchar

문의사항

- question_id    auto integer
- question       varchar
- is_active      enum(0,1)

질문_선택사항

- choice_id        auto integer
- question_id      Questions.question_id
- is_right_choice  enum(0,1)
- choice           varchar

사용자_질문_답변

- user_id        Users.user_id
- question_id    Questions.question_id
- choice_id      Question_choices.choice.id
- is_right       enum(0,1)
- answer_time    datetime

이 테이블 디자인에 대한 제 생각은 다음과 같습니다.

  • Users등록된 사용자를 저장하기 위한 것입니다.
  • Questions모든 질문을 저장하기 위한 것입니다.
    • 정말 그랬어요.is_active할 수 록용) )WHERE is_active = '1')
  • question_choices는 사용 가능한 모든 옵션을 저장하기 위한 것입니다.정말 그랬어요.is_right_choice이것은 어떤 선택이 특정 질문에 대한 올바른 답인지를 정의합니다.
  • User_question_answers는 사용자의 답변을 저장하기 위한 것입니다.
    • 정말 그랬어요.is_right를 높이기 및 다준) ).is_right_choice사전에 정의됨)
    • 그것은 또한 가지고 있습니다.answer_time특정 사용자가 언제 질문에 답하는지 주목하기 위해서입니다.

일반적으로 프로그래밍을 처음 하시는 분들인지는 잘 모르겠지만, 이제 막 시작하셨더라도 프레임워크를 사용하시는 것이 좋습니다.

프레임워크를 사용하면 프로젝트에 필요한 툴을 모범 사례로 구현할 수 있습니다.

저는 개인적으로 PHP 프로젝트에 Symfony를 사용하고 있는데, 가이드와 튜토리얼을 확인해보시기를 제안합니다.심포니는 잘 정립된 틀이며 널리 받아들여지는 디자인에 기반을 두고 있습니다.

하지만 좀 더 직접적으로 질문에 답하기 위해서, 저는 당신의 애플리케이션을 위해 다음과 같은 것을 제안하고 싶습니다.

 - user
  - id (PK)
  - last_name
  - first_name
  - email
  - gender


 - quiz
  - id (PK)
  - title


 - quiz_question
  - id (PK)
  - quiz_id (FK)
  - text

 - quiz_question_option
  - id (PK)
  - quiz_question_id (FK)
  - text
  - is_correct

 - quiz_user_answer
   - id (PK)
   - quiz_question_id (FK)
   - quiz_question_option_id  // this is the answer.

위의 내용을 통해 각 문항이 여러 개인 퀴즈를 정의하고 정답 세트(퀴즈에 대한 사용자의 정답 세트)를 만들고 각 정답을 기록할 수 있습니다.

도움이 되길 바라요 :)

이 프로젝트는 약 8년 전 PHP/MySQL에서 처음으로 수행한 프로젝트이기도 합니다.

첫 번째 해결책은 데이터베이스를 양식과 정확히 일치하도록 코드화하는 것입니다.따라서 사용자와 퀴즈 제출을 녹화하려고 하면 다음과 같이 나타납니다.

CREATE TABLE users (
  username VARCHAR(16) PRIMARY KEY, 
  password VARCHAR(8), 
  email VARCHAR(255), 
  birthday DATE, 
  gender ENUM('M', 'F')
);

CREATE TABLE quiz_answers (
  username VARCHAR(16) REFERENCES users,
  question1 VARCHAR(10),
  question2 INT,
  question3 ENUM('YES', 'NO', 'MAYBE'),
  question4 BOOLEAN,
  question5 VARCHAR(25),
  submitted_at DATETIME,
  PRIMARY KEY (username, submitted_at)
);

따라서 이것은 사용자와 퀴즈 제출이라는 최소한의 기록에 불과합니다.여러분이 실제 퀴즈에 맞게 만들어야 하는 답을 입력해 두었습니다.나는 또한 사용자와 그들이 그것을 제출한 순간에 키를 누른 응답을 했습니다; 당신은 대리키를 사용할 가능성이 더 높습니다.AUTO_INCREMENT), 하지만 저는 대리인들에게 최대한 저항하는 것을 좋아합니다.

즉시 1NF 위반이 발생합니다.questionN. 이 작업을 제대로 수행하고 있다면, 이 칼럼들의 이름은 단지 어떤 질문이냐는 것이 아니라 그것들의 의미를 따 이름을 지을 것입니다.하지만 이것을 정상화하는 것은 확장 가능하지만 역사를 추적할 수 있는 형태를 향한 정말 다음 단계입니다.

다음으로 여러분이 알아차릴 수 있는 것은 정말 퀴즈란 질문들의 집합이라는 것입니다. 각각의 질문들은 가능한 답들의 집합을 가지고 있다는 것입니다.그리고 양식 제출은 실제로 특정 퀴즈 사용자에 의한 특정 퀴즈 양식에 대한 선택된 답변 세트와 관련이 있습니다.이것은 사용자, 퀴즈, 질문, 정답의 4가지 관계처럼 들립니다.다른 퀴즈에 대한 질문을 반복해도 괜찮으시다면 그 중 하나를 잘라내셔도 되지만, 완성도를 위해서 이 길로 가봅시다.교체하다quiz_answers위의 내용:

CREATE TABLE questions (
  id INTEGER AUTO_INCREMENT PRIMARY KEY,
  question TEXT
);

CREATE TABLE answers (
  id INTEGER AUTO_INCREMENT PRIMARY KEY,
  question_id INTEGER REFERENCES questions,
  answer VARCHAR(255)
);

CREATE TABLE quizzes (
  name VARCHAR(255) PRIMARY KEY,
);

저희는 퀴즈를 위한 특별한 메타데이터가 없어서 지금은 그냥 이름입니다.

그래서 이제 여러분은 질문에서 답변으로, 퀴즈에서 질문으로 일대일 관계가 필요합니다.

CREATE TABLE question_answers (
  question_id INTEGER REFERENCES questions,
  answer_id INTEGER REFERENCES answers,
  idx INTEGER,
  PRIMARY KEY (question_id, answer_id)
);

CREATE TABLE quiz_questions (
  quiz_name VARCHAR(255) REFERENCES quizzes,
  question_id INTEGER REFERENCES questions,
  idx INTEGER,
  PRIMARY KEY (quiz_name, question_id)
);

위에서 언급한 것처럼 까다로운 부분은 사용자와 양식 제출 사이의 상위 관계, 양식 질문에서 사용자 답변까지의 링크입니다.반복하지 않기 위해 이것을 두 개의 테이블로 분리하기로 했습니다.

CREATE TABLE quiz_submissions (
  id INTEGER AUTO_INCREMENT PRIMARY KEY,
  username VARCHAR(16) REFERENCES users,
  quiz_name VARCHAR(255) REFERENCES quizzes,
  submitted_at DATETIME
);

CREATE TABLE submission_answer (
  submission_id INTEGER REFERENCES quiz_submissions,
  question_id INTEGER REFERENCES questions,
  answer_id INTEGER REFERENCES answers,
  PRIMARY KEY (submission_id, question_id)
);

이 시점에서 이는 상당히 잘 표준화되어 있습니다.질의하기가 좀 더 어려워진다는 것을 알 수 있습니다.퀴즈를 풀려면 퀴즈부터 문제까지 모두 참여해야 합니다.여기서 답변에 참여하여 양식을 작성하는 데 필요한 모든 데이터를 얻기 위해 하나의 큰 쿼리를 수행하거나(후처리를 더 많이 수행해야 함), 각 질문에 대해 데이터베이스를 한 번 더 누르고 후처리를 덜 수행할 수 있습니다.어느 쪽이든 다툴 수 있습니다.특정 사용자의 답을 모두 내보내려면 퀴즈 ID와 사용자 이름을 가진 user_submissions에서 질문과 사용자가 선택한 답에 대한 submission_답변표를 선택해야 합니다.그래서 쿼리가 빨리 흥미로워질 것입니다.가입하는 것에 대한 두려움을 잃게 될 것입니다.

이것이 여러분을 관계형 데이터베이스에서 너무 많이 멀어지게 하지 않기를 바랍니다. 이렇게 함으로써 사실상 여러분은 제한된 형태이지만 관계형 모델 안에서 관계형 모델을 하고 있는 것입니다.

위에서 했던 것처럼 자연 키를 많이 사용하는 것이 요즘은 좀 특이하다는 것을 알고 있습니다.하지만 적어도 시작할 때는 시도해 보는 것이 좋습니다. 1-10 범위의 모든 정수가 아닌 경우 조인이 어떻게 작동해야 하는지 쉽게 알 수 있기 때문입니다.

음, 지금은 개발 단계에 있지만 여전히 몇 가지 문제(즉, 서버와 클라이언트 간의 라운드 상태 동기화)에 직면해 있지만 도움이 될 수도 있습니다.

추신: 위의 그림처럼 데이터베이스에 암호를 저장하지 마십시오. 대신 암호 해시를 저장하십시오.

언급URL : https://stackoverflow.com/questions/7102521/database-design-for-developing-quiz-web-application-using-php-and-mysql