web-dev-qa-db-ja.com

MySQL + PHPで動的フィールドを使用してデータベースを設計する適切な方法は何ですか?

動的フィールドを持つデータベーステーブルの適切な構造を設計するのに助けが必要です。 PHPでMySqlを使用しており、現在作業しているシステム(在庫システム)には、ユーザーが生成したデータカテゴリを受け入れるテーブルが必要です。これは本当にうまくないので、ヘルプ高く評価されます。

これは私が今持っているものです(私はそれが本当に悪いデザインであることを知っています、助けてください)

在庫にはさまざまなタイプ(食品、衣服など)があり、詳細はユーザーが提供するもの(サイズ、ブランドなど)に基づいて動的です。

私はinventoryies_tblを持っています:

+-------------------+
| inventories_tbl   |
+-------------------+
| id                |
| item_name         |
| inventory_type_id |
| description       |
| cost              |
| price             |
| quantity          |
| created_at        |
| updated_at        |
+-------------------+

次に、inventory_types_tblがあります。

+--------------------+
|inventory_types_tbl |
+--------------------+
| id                 |
| name               | (e.g Food, Beverages, Clothing,etc)
| display_name       |
| created_at         |
| updated_at         |
+--------------------+

ここに問題のある部分があります。アイテムがどのタイプの在庫タイプであるかに従って動的在庫詳細を保存する必要があります。 (例:食品=「有効期限」など、飲料の場合=「正味量」、「アルコール度数」など)

そこで、inventory_attributes_tblを作成しました。

    +-------------------+
 | inventory_attributes_tbl |
    +-------------------+
    | id                |
    | name              | (e.g size, weight, model number, serial number etc)
    | inventory_type_id |
    | field_name        |
    | created_at        |
    | updated_at        |
    +-------------------+

次に、特定の在庫の属性の値を格納するinventory_attributes_values_tblがあります。

    +-------------------------+
  inventory_attributes_values_tbl
    +-------------------------+
    | id                      |
    | inventory_attributes_id |
    | inventory_id            |
    | value                   |
    | created_at              |
    | updated_at              |
    +-------------------------+

この設定では、アイテムの削除/更新が非常に複雑になり、グラフなどのアイテムの動的な詳細に基づいて後でレポートを作成する必要もあります。この設定により、クエリが非常に遅くなり、実際にサーバーが10k以上のクエリでハングするようになります結果の。ご意見をお待ちしております。前もって感謝します。

2

タイプJSONを使用することが可能

https://dev.mysql.com/doc/refman/8.0/en/json.html

これにより、カスタムフィールドのテーブルの必要性がなくなりますが、このデータで結合/検索を行う必要がある場合は、困難になります。

1
Luke Robertson