1

個人テーブルがあり、ユーザーがカスタムの多対多の情報関係を作成できるようにしたいと考えています。教育、住居、雇用、言語など。これらには、異なる数の列が必要になる場合があります。例えば

Person_languages(person_fk,language_fk)
Person_Educations(person,institution,degree,field,start,end)

このようなことを考えました。(正しくない sql)

create Tables(
             table_id PRIMARY_KEY,
             table_name_fk FOREIGN_KEY(Table_name),
             person_fk FOREIGN_KEY(Person),
             table_description TEXT
            )

すべてのカスタム テーブル名と説明を保持するテーブル

create Table_columns(
                     column_id PRIMARY_KEY,
                     table_fk FOREIGN_KEY(Tables),
                     column_name_fk FOREIGN_KEY(Columns),
                     rank_column INT,
                    )

各カスタム テーブルの列とそれらが表示される順序を保持するテーブル。

create Table_rows(
                  row_id PRIMARY_KEY,
                  table_fk FOREIGN_KEY(Tables),
                  row_nr INT,
                 )

各カスタム テーブルの行を保持するテーブル。

create Table_cells(
                   cell_id PRIMARY_KEY,
                   table_fk FOREIGN_KEY(Tables),
                   row_fk FOREIGN_KEY(Table_rows),
                   column_fk FOREIGN_KEY(Table_columns),
                   cell_content_type_fk FOREIGN_KEY(Content_types),
                   cell_object_id INT,
                  )

セル情報を保持するテーブル。

カスタムテーブルがほとんどの人に使用され始めて大きくなった場合、そのテーブル専用の別のハードコードされた多対多テーブルに抽出することが考えられました.

これはばかげた考えですか?これを行うより良い方法はありますか?

4

1 に答える 1

2

私はそのようなデザインに反対することを強くお勧めします-あなたは非常に断片化された読みにくいデザインへの道を進んでいます。

IIUCの基本的な問題は、他の(非普遍的な)プロパティによって拡張される可能性のある、人に共通の(普遍的な)プロパティのセットがあることです。

これに取り組むには、personテーブルにユニバーサルプロパティを設定し、さらに2つのテーブルを作成しますproperty_types。これはプロパティ名をINT主キーに変換しperson_properties、person PK、propety PK、およびvalueを組み合わせたものです。

このテーブルのPKを設定すると(person,property)、その人の可能な限り最高のインデックスの局所性が得られます。これにより、人のすべてのプロパティを要求するのが非常に高速になります。

于 2012-12-20T10:05:19.063 に答える