データベースの構造と命名規則

テーブル名

  • あるエンティティの基本情報を格納するテーブルには、そのエンティティの名前を複数形で付けます。例えば、products テーブルは、ECサイトやマーケットプレイスサイトの商品に関する基本情報を格納します。
  • エンティティや子エンティティの追加データを格納するテーブルは、entity_suffixのように命名されます。接尾辞は複数形です。例えば、商品価格を格納するテーブルはproduct_pricesとなります。
  • この例では、より複雑なテーブルの依存関係を示しています。
    • products:商品の基本情報。
    • product_features:商品の追加情報。
    • product_feature_variants:商品の追加情報のバリエーション情報
    • product_feature_variant_descriptions:商品の追加情報のバリエーションの各言語ごとの説明。

依存関係が深くなると、テーブル名の最後の接尾辞だけが複数形を保持します

テーブルのプレフィックス(接頭辞)

During the installation you can specify a prefix that will be used for all tables. The default prefix is cscart_.

The functions that work with the database have the ?: placeholder to replace the table prefix in the SQL queries. Therefore, if you use a table name in an SQL query, you must add the ?: placeholder before the name of the table. For example:

インストール時に全てのテーブルに使用されるプレフィックス(接頭辞)を指定することができます。デフォルトの接頭辞は  cscart_ です。

データベースで動作する関数はSQLクエリでテーブル接頭辞を置き換えるために?: プレースホルダがあります。したがって、SQLクエリでテーブル名を使用する場合は、テーブル名の前に?: プレースホルダを追加する必要があります。

  • 使用例
$products = db_get_array(
    'SELECT * FROM ?:products LEFT JOIN ?:product_popularity USING(product_id)'
);

主(プライマリー)キーのカラム名

主キーと外部キーに属するフィールドの名前には、接頭辞としてエンティティの名前が付きます。例えば、products テーブルのユニークな主キーを持つフィールドは product_idとなります。CS-Cart をカスタマイズするときにコードの整合性を維持するために、この規約に従うことをお勧めします。

多言語のエンティティ

データベースに格納されたエンティティは、言語ごとに異なる内容のフィールドを持つことがあります。例えば、商品は異なる言語で別の名前と説明を持つことができます。CS-Cart はこのようなフィールドを以下のように保存しています。

  • 別のテーブルが作成されます。このテーブルは、entity_descriptions(例えば、product_descriptions)となります。
  • このテーブルには、多言語サポートが必要なエンティティの主キーを参照するカラムが必要です。私たちの場合、このカラムはproduct_idです。
  • テーブルには、エントリを追加する言語のコードを格納するカラムも必要です。このカラムは通常 lang_codeと呼ばれ、CHAR(2)型です。
  • さらに、多言語対応のフィールドのカラムがテーブルに追加されます。この例では、product (商品名)、full_description(商品の詳細説明)、その他のフィールドです。

このテーブルを扱うロジックはPHPコードによって処理されます。ここではproduct_descriptionsテーブルを使ってロジックを説明します:

  • 新しい商品に関するデータをproduct_descriptions テーブルに保存するとき、DESCR_SL 定数(商品を編集するために選択された言語)の値もlang_code フィールドに保存します。
  • ECサイトやマーケットプレイスサイトに表示するデータを抽出するとき、llang_code フィールドの値がCART_LANGUAGE定数の値(ユーザがECサイトやマーケットプレイスサイトで選択した言語)と等しいという条件で、多言語データを持つテーブルを結合します。
  • 以下はSQLクエリの例です・
SELECT products.*, product_descriptions.* FROM products
INNER JOIN product_descriptions
    ON product_descriptions.product_id = products.product_id
    AND product_descriptions.lang_code = 'en'
Table Storage Engine

テーブル・ストレージエンジン

CS-Cart のすべてのテーブルは、MyISAM を使用します。しかし、必要であれば、テーブルのタイプをInnoDBに変更することができます。

InnoDB には、MyISAM よりも多くの利点があります。

  • FOREIGN KEY制約(外部キー制約を設定する)
  • 最新のMySQLバージョンにおけるインデックスの高度な使用
  • トランザクションのサポート

InnoDBのアーキテクチャにより、データやテーブルスキーマを変更するクエリの処理には、MyISAMよりも時間がかかる場合があります。

InnoDB に移行する場合、テーブルに追加するFOREIGN KEY制約によって、CS-Cart のデータの変更と削除の順序が正しく処理されない場合があります。

CS-Cartは、リンクされたエンティティの更新と削除にPHPコードを使用します。たとえば、カテゴリーを削除すると、CS-Cart はすべての子商品とサブカテゴリーを削除します。その場合、MySQL が同じことをしようとするため、ON UPDATE CASCADE/ON DELETE CASCADEのようなFOREIGN KEY制約のカスケードで問題が発生する可能性があります。

PHPコードでデータのカスケード更新と削除を実装することを強くお勧めします。
また、cscart_cache_handlersはMyISAMのままでなければならないので、このテーブルを変換することは推奨されていません。
テーブルをInnoDBに変換する前に、データベースの完全なバックアップを作成することをお勧めします。

アップグレードに関して:MyISAMからInnoDBへの切り替えは、一般的に、バージョンアップ中に問題を引き起こすことはありません。

データベース内のロジック

データベース内でロジックを使用しないでください。すべてのサーバがトリガーやストアドプロシージャなどを作成するための MySQL権限を提供しているわけではありません。さらに、データベースで追加されたロジックは、 PHP コードで実装されたロジックと重複したり競合したりする可能性があります。