-1

リレーショナル モデルでは、次のことが一般的に理解されています。

  1. すべての関係操作は、関係を生成する必要があります。
  2. リレーションはセットであるため、重複する行を含めることはできません。

次のデータを含む「USERS」関係を想像してください。

ID FIRST_NAME LAST_NAME
 1 Mark       Stone
 2 Jane       Stone
 3 Michael    Stone

誰かがクエリを実行するselect LAST_NAME from USERSと、典型的なデータベースは以下を返します:

LAST_NAME
Stone
Stone
Stone

これはリレーションではないため (重複する行が含まれているため)、理想的な RDBMS は何を返す必要がありますか?

4

5 に答える 5

3

「しかし、一部の情報が失われています。その姓を持つユーザーが 3 人いるということです。」

その名前を持つユーザーの数に関心がある場合、例のクエリは質問すべき質問ではありません。

あなたの例のクエリは、「その姓を持つユーザーが存在するようなすべての姓は何ですか?」という質問に対する答えを提供します。

尋ねたい質問が「「Stone」という名前のユーザーは何人いるか」である場合、送信する必要があるクエリは次のとおりです。Select count(...) from users where last_name = 'Stone';

プロジェクションは常に情報を「失います」: アトリビュートに関連付けられている情報は、離れて投影されます。有用な関係演算子の既知のプロパティを、その演算子に対する引数として説明する方法がわかりません。

于 2010-10-10T23:00:07.963 に答える
2

RDBMS では、姓の列のみに対するリレーショナル プロジェクションは、姓の個別の値を持つ一連のタプルのみを返します。重複するタプルはありません。

SQL では、DISTINCT キーワードを指定しない限り、重複が発生するのは事実です。これは、SQL が真のリレーショナル言語ではないためです。とりわけ、SQL テーブルとテーブル式は適切な関係ではないためです。SQL DBMS は RDBMS ではありません。

于 2010-10-08T15:14:27.657 に答える
2

「理想的な RDBMS は何を返すべきか?」

Davidが示したように、(あなたの例では)1行を返す必要があります。

SQL DBMS は、SELECT DISTINCT が要求されたかのようにすべての SELECT を処理する場合にのみ、リレーショナル DBMS です。(ただし、満たすべき小さな追加条件もいくつかあります。)

これがそうである理由は、その単一の行の「意味」が次のとおりであるためです。

そのステートメントをもう一度繰り返す論理的な必要性は決してありません。あなたが求めた信頼できる参考文献は、テッド・コッド自身です。

于 2010-10-08T20:38:44.117 に答える
1

戻り値に問題があるかどうかはわかりません。の「石」を含むレコードが 3 件ありますLAST_NAMEFIRST_NAMEまたはIDがクエリに含まれていれば、これは明らかでしたが、そうではありませんでした。通常、DISTINCTキーワードを使用してこれを処理し、重複がないようにします。

実際、私のデータベースがDISTINCT自動的に適用を開始した場合 (そうすべきだと思われるかもしれません)、私は多少イライラするでしょう。データベースで奇妙なデータの問題をデバッグするときに、予期しないときに重複行が表示されることは、多くの場合必要な休憩です。

于 2010-10-08T14:13:26.977 に答える