3

「Question」というデータベーステーブルについてサポートが必要です。主キーに関しては、以下の2つのうちどちらが優れているか知りたいです。

質問表の方法1:

QuestionId (int 3) PK
SessionId (varchar10) PK
QuestionContent (varchar800)
NoofAnswers (int 3)
AnswerId (int 5) Auto Increment
Marks (int 3)

上記の表では、QuestionIdとSessionIdはPK(主キー)であり、AnswerIdはPKではありませんが、自動インクリメントです。

質問表の方法2:

QuestionId (int 3)
SessionId (varchar10)
QuestionContent (varchar800)
NoofAnswers (int 3)
AnswerId (int 5) Auto Increment PK
Marks (int 3)

上記の表では、AnswerIdのみがPKと自動インクリメントです。しかし、そうすると、QuestionIdを含む他のテーブルが、このテーブルのQuestionIdに非キーなどとしてリンクする必要があることを意味します。

データベースは、AnswerIdが自動インクリメントであるため、他の主キーが不要であると言っているため、QuestionId、SessionId、およびAnswerIdのPKを実行できません。

4

2 に答える 2

3

どちらの場合も良くないと思います!あなたはPKに意味を与えていますが、PKには意味がないはずです。

PK aint(11) Auto Incrementを作成し、テーブルを外部キーとリンクするだけです。

アップデート

各テーブルには独自のPKがあります。QuestionsテーブルにはQuestionIdPKがあります。

テーブルを結び付けることは、テーブルが持つ関係に基づいています。1:1関係、1:many関係、関係にはさまざまなシナリオがありますmany:many

例:

CREATE TABLE `Questions` (
  `QuestionId` int(11) NOT NULL AUTO_INCREMENT,
  `AnswerId` int(11) DEFAULT NULL,
  PRIMARY KEY (`QuestionId`),
  KEY `FK_Answer` (`AnswerId`),
  CONSTRAINT `FK_Answer` FOREIGN KEY (`AnswerId`) REFERENCES `Answers` (`AnswersId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `Answers` (
  `AnswerId` int(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`AnswerId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

質問から見ると、質問に対する回答は1つだけです(1:1)。答えから見ると、多くの質問に使用できます(1:n)。リレーションのmany:many場合、追加のテーブルが必要です。

ここにいくつかの追加の説明をしているyoutubeがあります:http ://www.youtube.com/watch?v = RXOj0D80kRg

于 2012-10-01T19:07:28.130 に答える
0

正規化:

テーブル セッション: ID

表の質問: id (int 3) 自動インクリメント pk session_id varchar255 QuestionContent (varchar800) マーク (int 3)

表の回答: id 自動インクリメント pk question_id (参照 question(id)) content varhcar(255)

于 2012-10-01T19:12:46.637 に答える