0

私のデータベースには、基本的に質問とその選択肢と回答を含むテーブルがあります。最初のフィールドは ~questionid~ で、予想どおり主キーです (今のところ AUTOINCREMENT を無効にしています)。クライアントがいくつかの質問を削除したい可能性があります。これにより、2つのオプションが残ります。

  1. 後続の質問はすべて上に移動して、空の行がないようにします。このオプションは、それらの質問の質問 ID が変更されることを意味します

  2. そのままにしておくと、空の行ができます。新しいエントリがある場合は、最初の空の行を埋める必要があります。

それらのいずれかを実装するにはどうすればよいですか? 私は実際には 2 番目の方が好みですが、別の意見がある場合は大歓迎です。
MySQL データベースと C# を使用しています。

4

2 に答える 2

2

データベースを使用しているため、これらの問題について心配する必要はありません。

SQL テーブルには「空の」行という概念はありません (すべての列が NULL の場合、その行は空であると言えますが、ここでは関係ありません)。SQL テーブルの行は、本質的に順序付けされていません。

行自体はページに格納されますが、行を増やすための余分なスペースがある場合とない場合があります。これは、空の行を考えるときに考えていることかもしれません。

行が削除されても、データは再配置されません。後で新しい行が追加された場合に備えて、ページに追加のスペースがあります。2 つの既存の行の間に主キーを持つ新しい行を追加し、ページがいっぱいになると、データベースはページを 2 つに「分割」します。他の 2 ページには余分なスペースがあります。

ただし、重要な点は、これがどのように機能するかではありません。アプリケーションにリレーショナル データベースを使用する理由の 1 つは、実際の物理ストレージを気にせずに行を追加および削除できるようにするためです。

大量のトランザクション (削除と挿入) を持つデータベースがある場合は、定期的にデータを並べ替えて、ページにうまく収まるようにすることができます。ただし、このような最適化は通常、そのようなトランザクションが大量にある場合にのみ必要です。

ただし、1 つ。アプリケーションは、削除を正しく処理できるように、主キーが連続していることに依存するべきではありません。

于 2012-08-20T00:49:54.797 に答える
0

どのように実装したかわかりません。このようにすればよかったのですが、

  questions
     question_id - pk
     question

  answers
     answer_id - pk
     answers

  question_answer
      question_id
      answer_id

これにより、より多くの利点が得られます。多くの質問は同じ答えになります。質問を削除できる場合は、question_answer テーブルから回答とともに削除します

于 2012-08-20T00:48:31.780 に答える