まず、これを正確に検索する方法がわからないので、重複している場合は失礼します。そして、それが他のStackExchangeサイトの1つにより適しているかどうかさえわかりません。もしそうなら、私に知らせてください、そして私は代わりに向こうで尋ねます。いずれかの方法...
プロジェクトの概要
私は、プログラミングとデータベース設計を実践するための趣味のプロジェクト(ある種の作家のノート)に取り組んでいます。基本的な構造は非常に単純です。ユーザーはノートブックを作成でき、各ノートブックの下にそのノートブックに関連付けられたプロジェクトを作成できます。たぶん、ノートブックは一連の短編小説用であり、各プロジェクトは個別の物語用です。
次に、ノートブック内の特定のプロジェクト、またはノートブック自体にアイテム(シーン、キャラクターなど)を追加して、特定のプロジェクトに関連付けられないようにすることができます。このようにして、複数のプロジェクトにまたがるシーンや場所を設定したり、特定のプロジェクトに固有のシーンや場所を設定したりできます。
問題
私は、データベース内、特に可能な限りテーブル構造と制約内に、かなりの量のロジックを保持しようとしています。私が多くのアイテムに対して持っている基本的な構造は基本的に次のようなものです(私はMySqlを使用していますが、これはかなり一般的な問題です-構文について言及するだけです):
CREATE TABLE SCENES(
ID BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY NOT NULL,
NOTEBOOK BIGINT UNSIGNED NULL,
PROJECT BIGINT UNSIGNED NULL,
....
);
問題は、2つの参照、NOTEBOOKおよび/またはPROJECTの少なくとも1つが設定されていることを確認する必要があることです。両方を設定する必要はありません。PROJECTには、それが含まれているノートブックへの参照があります。一般的な「親ID」フィールドを使用できることはわかっていますが、外部キーを使用することはできないと思います。 2つのテーブルの鍵ですよね?追加の相互参照テーブル(つまり、SCENES_X_NOTEBOOKSとSCENES_X_PROJECTS)を追加する可能性もありますが、作業しているさまざまなアイテムタイプごとに同様のテーブルを追加する必要があるため、すぐに手に負えなくなります。と。これは、各アイテムが相互参照テーブルにエントリを持っていることを確認するという問題も引き起こします。
この種のロジックをストアドプロシージャやアプリケーションロジックに配置するのは簡単ですが、ロジックがバイパスされる可能性を排除するために、可能な限り何らかの制約を維持したいと思います。何とかして。
何かご意見は?テーブルの再設計などが含まれている場合でも、私はほとんど何にでも興味があります。