2012-05-14 17 views
0

私は以下のテーブルを持っています。プライマリキー、スーパーキーと候補キーを取得する方法を知りたいと思っていました。プライマリ、候補とスーパーキー

私は候補キーがスーパーキーの最小であることを知っています。

これは正しいプライマリキーPlaceId CountyId、候補キーPlaceId, CountyId, Date、スーパーキーPlaceId, CountyId, Date, Attendeesでしょうか?

CREATE TABLE IF NOT EXISTS `visits` (
    `PlaceId` varchar(45) DEFAULT NULL, 
    `CountyId` varchar(45) DEFAULT NULL, 
    `Date` date NOT NULL, 
    `Attendees` varchar(45) DEFAULT NULL, 

INSERT INTO `visits` (`PlaceId`, `CountyId`, `Date`, `Attendees`) VALUES 
('Bangor', 'Gwynedd', '2012-05-03', '34'), 
('Bangor', 'Gwynedd', '2012-05-04', '24'), 
('Rhyl', 'Denbighshire', '2012-05-06', '14'); 
+1

(CountyId、CountyId)は、2つの行に同じ値が設定されているため、キーではありません。 CountyIdがキーに属しているかどうかは、機能的にPlaceIdに依存しているかどうかによって異なります(4つのサンプル行に基づいているように見えますが、一般的ではない可能性があります)。 –

+1

私はこれらの列をキーとして使用しません。 'varchar(45)' ouch!場所、国、出席者ごとに新しいテーブルを作成し、新しいテーブルのそれぞれのint pkを使用してこの訪問テーブルにFKを戻します。 int値を持つ出席者がいるようですが、なぜvarchar(45)を使用するのですか? –

答えて

1

指定されたサンプルデータに基づいて、および場所日付、および出席者が何を意味するかの私の理解した上で、唯一の候補キーは{PlaceId、CountyId、日です}。

候補キーは1つだけなので、候補キーもプライマリキーでなければなりません。

すべての属性のセットは簡単なスーパーキーです。 1つのスーパーキーは{PlaceId、CountyId、Date、Attendees}です。もう1つは{PlaceId、CountyId、Date}です。

+0

ありがとう4あなたの助け{PlaceId、CountyId、Attendees}は、日付をデフォルト値に変更した場合候補キーになりますか? – suryll

+1

@suryll:いいえ。あなたのサンプルデータはそれを可能にしますが、あなたのサンプルデータは代表ではありません。あなたは確かに{'Bangor'、 'Gwynedd'、 '2012-05-05'、34}のようなものを許可する必要があります。あなたが提案する「鍵」はそれを許さないでしょう。 (異なる日に1つの場所に同じ数の出席者があります。) –

関連する問題