データベースの構造と命名規則
テーブル名
-
各エンティティーの基本情報を格納するテーブルは、そのエンティティーにちなんだ複数形の名前が付けられます。たとえば、
products
テーブルにはショップの商品に関する主要な情報が格納されます。 -
エンティティまたはその関連するエンティティの追加データを格納するテーブルには、entity_suffixのような名前が付けられます。接尾辞は複数形です。たとえば商品価格(product prices)を格納するテーブルは
product_prices
となります。 -
下記の例は、より複雑なテーブルの依存関係を示しています。
-
products - 商品に関する基本情報
-
product_features - 商品の追加情報
-
product_feature_variants - 商品の追加情報のバリエーション情報
-
product_feature_variant_descriptions - 商品の追加情報のバリエーションの各言語ごとの説明
依存関係が深くなるにつれて、テーブル名の最後の接尾辞のみが複数形となります。
テーブルのプレフィックス(接頭辞)
インストール際にすべてのテーブルに使用されるプレフィックスを指定できます。
デフォルトのプレフィックスはcscart_
です。
データベースに接続する関数には、SQLクエリーにおいてテーブルプレフィックスを置き換える?:
プレースホルダーがあります。したがって、SQLクエリでテーブル名を指定する場合は、テーブルの名前の前に?:
プレースホルダーを追加する必要があります。
<?php
$ 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
フィールドに保存します。 -
ショップフロントに表示するデータを抽出するとき、
lang_code
フィールドの値がCART_LANGUAGE
定数(ショップフロントでユーザーが選択した言語)の値と等しいという条件で、テーブルを多言語データと結合します。 -
具体的なSQLクエリの例です。
SELECT products.*, product_descriptions.* FROM products
INNER JOIN product_descriptions
ON product_descriptions.product_id = products.product_id
AND product_descriptions.lang_code = 'ja'
MySQLストレージエンジン
CS-CartのすべてのテーブルはMyISAMを使用します。
ただし、必要に応じてテーブルのタイプをInnoDBに変更できます。(CS-Cartは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コードで実行することを強くお勧めします。
データベース内のロジックについて注意事項
データベースにおいてロジックを使用しないでください。すべてのサーバーがトリガー、ストアドプロシージャなどを作成するMySQL権限を備えているわけではありません。
さらに、データベースに追加されたロジックは、PHPコードを介して実行されたロジックと重複または競合する場合があります。
Updated over 4 years ago