3

ファイルとユーザーの 2 つのテーブルを含むデータベースがあります。この関係は多対多であるため、上記の両方のテーブルへの外部キーを保持する users_files_ref というテーブルもあります。

各テーブルのスキーマは次のとおりです。

ファイル -> file_id、file_name

ユーザー -> user_id、user_name

users_files_ref -> user_file_ref_id、user_id、file_id

私は Codeigniter を使用してファイル ホスト アプリケーションを構築しており、ユーザーがファイルをアップロードできるようにする機能を追加している最中です。これが私の問題に直面しているところです。

ファイル テーブルにファイルを追加したら、users_files_ref テーブルを更新するためにその新しいファイルの ID が必要になります。現在、ファイル テーブルにレコードを追加しています。次に、最後に追加されたファイルを取得するクエリを実行して ID を取得し、その ID を使用して新しい users_files_ref レコードを挿入することを想像しました。

これが小規模で機能することはわかっていますが、特にトラフィックの多いシナリオでは、これらのレコードを管理するためのより良い方法があると思います.

私はリレーショナル データベースは初めてですが、しばらくの間 PHP を使用しています。

ファイル、ユーザー、users_files_ref テーブルの主キーと外部キーを正しく設定しましたが、このシナリオでファイル レコードの追加をどのように管理すればよいのでしょうか?

提供されたヘルプに感謝します。

-ウェス

4

3 に答える 3

1

$this->db->insert_id()挿入した行の ID 番号を取得するために使用 します。詳細なドキュメント: http://codeigniter.com/user_guide/database/helpers.html

于 2010-04-04T21:15:54.600 に答える
0

必要なのはこれだけだと思います:

                   ----primary key-----
users_files_ref -> | user_id, file_id |

file_id を取得する方法は、実装しているコードによって異なります。あなたの推論は正しいです。すでに user_id を取得しており、file_id を取得するだけで済みます。これらの値を使用して、新しい行を user_files_ref に追加できます。

これを行う必要があるときは、通常、ファイルを挿入し、シーケンスを出力として返すシーケンスの助けを借りてストアド プロシージャを使用しNEXTVALます。これは、そのようなシナリオを実装する方法かもしれません。

これは、Oracle ベースのストアド プロシージャのコードです。

CREATE OR REPLACE PROCEDURE SP_IMPORT_FILE(FILE    IN  FILE.FILE%TYPE,
                                           FILE_ID OUT NUMBER)

IS

BEGIN

  SELECT SEQ_FILE.NEXTVAL INTO FILE_ID from DUAL;

  INSERT INTO FILE (FILE_ID, FILE) VALUES (FILE_ID, FILE);

END SP_IMPORT_FILE;
于 2010-04-04T19:08:25.787 に答える
0

基本的に、それが通常どのように行われるかを説明していますが、重要な調整が 1 つあります。それは、ファイルの file_id を取得して、それを users_files_ref に追加できるようにする方法です。

通常、データベース環境では、多数のクライアントが同時に接続し、同時に更新を行っています。このような環境では、最後に追加されたファイルの file_id を取得することはできません。DB 呼び出しの間に他の誰かのファイルが追加された可能性があります。データベースの機能を使用して ID を生成する ( SELECT @@IDENTITYMSSQL などで) か、何らかの方法でアプリケーション コードで ID を生成する必要があります。

于 2010-04-04T19:09:33.437 に答える