0

私のデータベースには、ユーザーが作成したテキスト「メモ」を添付したいカテゴリがいくつかあります。たとえば、 という名前の上位レベルのテーブルのエントリにはjobs、ユーザーがそれについていくつかのメモを書いている場合がありますが、 の下位レベルのエントリもそうかもしれませんsub_projectsjob_notesこれらのメモはすべて同じ形式になるため、やのような一連のテーブルではなく、メモ テーブルを 1 つだけ持つことで物事を簡素化し、project_notes複数の多対多の関係を使用して複数の一度に他のテーブル。

これが最初から大きな欠陥のあるアイデアではない場合 (そうである場合はお知らせください!)、これを行うための最良の方法は何かと考えています。私が見たように、私は2つの方法でそれを行うことができました:

  1. job_notes_mappingやなどの大きなカテゴリごとに多対多のジャンクション テーブルを用意project_notes_mappingし、MtM 関係を個別に管理します。
  2. table_typeMtM リレーションシップがマッピングされるテーブルを指定する、列挙型または別のテーブルにリンクされた単一のジャンクション テーブルを用意します。

    +-------------+-------------+---------------+
    | note_id     | table_id    | table_type_id |
    +-------------+-------------+---------------+ 
    |           1 |           1 | jobs          |
    |           2 |           2 | jobs          |
    |           3 |           1 | project       |
    |           4 |           2 | subproject    |
    | ........... | ........... | ........      |
    +-------------+-------------+---------------+
    

これらのいずれかが完全に恐ろしいアイデアである場合は申し訳ありませんが、少なくとも概念的には興味深い質問かもしれないと思いました.

4

2 に答える 2

1

IMO の理想的な方法は、一般的なファクト タイプを定義できる、ジョブ、プロジェクト、およびサブプロジェクトのスーパータイプ (アクティビティと呼びましょう) を持つことです。

例 (ジョブ、プロジェクト、およびサブプロジェクトが包含階層を形成すると想定しています):

activities (activity PK, activity_name, begin_date, ...)
jobs (job_activity PK/FK, ...)
projects (project_activity PK/FK, job_activity FK, ...)
subprojects (subproject_activity PK/FK, project_activity FK, ...)

残念ながら、ほとんどのデータベース スキーマは一意の自動インクリメント識別子 PER TABLE を定義しているため、データがロードされた後にスーパータイピングを実装することが非常に困難になります。PostgreSQL ではシーケンスを再利用できます。これはすばらしいことですが、他の DBMS (MySQL など) ではまったく簡単にはできません。

私の 2 番目の選択肢は、外部キー制約を定義できるため、オプション 1 です。オプション2はまったく好きではありません。

于 2015-07-13T15:43:19.983 に答える
0

残念ながら、これに対する最も醜い答えに行き着いてしまいました。それは、さまざまな種類のエントリ (job_notes、project_notes、および subproject_notes) ごとにメモ テーブルを用意することです。その理由は次のとおりです。

  • ジャンクションの「タイプ」を含む列を持つ単一のジャンクション テーブルは、外部キーが「実際の」ものではなく、手動で検索する必要があるため、パフォーマンスが低下します。これは、Notes フィールドにエントリごとに大量のテキストが含まれているという事実によって悪化します。

  • エントリごとのジャンクション テーブルは、テーブル タイプごとに個別のメモ テーブルを用意するだけでなく、追加のテーブルを追加します。わずかにきれいに見えますが、実質的なパフォーマンスの向上はありません。

説明されているすべてのジョブ/プロジェクト/サブプロジェクト テーブルに対して同じ Notes テーブルを効果的に複製するのは非常に無駄に思えるため、この回答には満足していません。しかし、長期的にパフォーマンスを維持する答えを見つけることができませんでした. 誰かがこれを行う方法についてより良い推奨事項を持っている場合に備えて、これを開いたままにします!

于 2015-07-15T12:59:31.430 に答える