1

「Whatever」を格納するテーブルを持つリレーショナル データベース (MySql) があります。このテーブルには、さまざまな (論理型とデータ型) のプロパティを格納する多くのフィールドがあります。リクエストは、別の 150 の新しい関連のないプロパティを追加することです。

確かに、150 の新しい列を追加したくありません。他に 2 つのオプションがあります。

  1. 単純なキーと値のテーブル(ID、FK_Whatever、Key、Value、およびおそらく Type)を追加します。*FK_Whatever* は、Whatever ID を参照し、Keyはプロパティの名前になります。JOIN を使用したクエリは機能します。
  2. 巨大なテキスト フィールドをWhateverテーブルに追加し、150個の新しいプロパティをシリアル化します(おそらくXmlとして)。これは、ある意味では、データを格納する NoSql の方法です。これらのフィールドを照会することは、いくつかのスマートな全文ステートメントを実装することを意味します。

どちらの場合も型の安全性は失われますが、とにかくそれは本当に必要ありません。

この一般的な問題には、よりスマートな解決策があると感じています (さまざまな理由で NoSql データベースに移行することはできません)。誰にもヒントはありますか?

4

1 に答える 1

3

ビジネス オブジェクトの任意の拡張属性を格納する必要がある以前のプロジェクトでは、次のように拡張スキーマを作成しました。

CREATE TABLE ext_fields
{
    systemId INT,
    fieldId  INT,
    dataType INT // represented using an enum at the application layer.

    // Other attributes.
}

CREATE TABLE request_ext
{
    systemId   INT,  // Composite Primary Key in the business object table.
    requestId  INT,  // Composite Primary Key in the business object table.
    fieldId    INT,
    boolean_value BIT,
    integer_value INT,
    double_value  REAL,
    string_value  NVARCHAR(256),
    text_value    NVARCHAR(MAX),
}

特定のレコードには、ext_fields テーブルで定義されているフィールドのデータ型に基づいて設定された _value 列のみが含まれます。これにより、フィールドの型とその値を失わずに済み、これらのデータ型に対して DBMS が提供するすべてのフィルタリング メソッドをうまく利用することができました。

私の2セント!

于 2012-08-22T10:25:14.547 に答える