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

## テーブル名

* 各エンティティーの基本情報を格納するテーブルは、そのエンティティーにちなんだ`複数形`の名前が付けられます。たとえば、`products`テーブルにはショップの商品に関する主要な情報が格納されます。
* エンティティまたはその関連するエンティティの追加データを格納するテーブルには、`entity_suffix`のような名前が付けられます。接尾辞は`複数形`です。たとえば商品価格（product prices）を格納するテーブルは`product_prices`となります。
* 下記の例は、より複雑なテーブルの依存関係を示しています。
* `products` - 商品に関する基本情報
* `product_features` - 商品の追加情報
* `product_feature_variants` - 商品の追加情報のバリエーション情報
* `product_feature_variant_descriptions` - 商品の追加情報のバリエーションの各言語ごとの説明

{% hint style="info" %}
TIPS

依存関係が深くなるにつれて、テーブル名の最後の接尾辞のみが複数形となります。
{% endhint %}

## テーブルのプレフィックス（接頭辞）

インストール際にすべてのテーブルに使用されるプレフィックスを指定できます。\
デフォルトのプレフィックスは`cscart_`です。

データベースに接続する関数には、SQLクエリーにおいてテーブルプレフィックスを置き換える`?:`プレースホルダーがあります。したがって、SQLクエリでテーブル名を指定する場合は、テーブルの名前の前に`?:`プレースホルダーを追加する必要があります。

```php
<?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クエリの例です。

```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バージョンでのインデックスの使用が可能
* トランザクション機能をサポート

{% hint style="info" %}
TIPS

InnoDBの構成上、MyISAMよりも、データまたはテーブルのスキーマを変更するクエリーの処理に時間がかかる場合があります。
{% endhint %}

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

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

{% hint style="warning" %}
注意

カスケードの更新とデータの削除をPHPコードで実行することを強くお勧めします。
{% endhint %}

## データベース内のロジックについて注意事項

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