5

インターネットに関するほとんどの質問は、Order、OrderItem に焦点を当てています。オンライン小売のすべての側面 (Order、OrderItem、Return、Refund、Exchange) を包括的に処理するデータベースの設計について疑問の余地はほとんどありません。

私は基本的にこのデータモデルを知っています。

製品 (製品 ID、名前など)
注文 (注文ID、日付、総費用など)
OrderItem (OrderID、ProductID、Quantity、UnitPrice など)

上記の構造に基づいて、返品、返金、交換をどのように管理できますか?

スーパーマーケットで商品を返品/交換すると、スタッフが新しい請求書を再生成することに気付きました。これは彼らが返品、返金、交換を処理する方法ですか?

4

4 に答える 4

4
  • (F table.column) は、table.column を指す外部キーを意味します。
  • (P) は主キーを意味します
  • (U) は一意のキーを意味します

ここにいくつかのテーブルとサンプルデータがあります...

addresses
    id          unsigned int(P)
    line1       varchar(50)
    line2       varchar(50) // Allow NULL
    city_id     unsigned int(F cities.id)
    zip         varchar(6) // 5 digits for US and MX, 6 characters (X9X9X9) for CA
    zip4        char(4) // Allow NULL

+----+-----------------+-------+---------+--------+------+
| id | line1           | line2 | city_id | zip    | zip4 |
+----+-----------------+-------+---------+--------+------+
|  1 | 123 Main Street | Apt A |      17 | 92101  | 1234 |
|  2 | 345 East Street | NULL  |      25 | T1X0L3 | NULL |
| .. | ............... | ..... | ....... | ...... | .... |
+----+-----------------+-------+---------+--------+------+

cities
    id                  unsigned int(P)
    state_id            unsigned int(F states.id)
    name                varchar(50)
    ...

+----+----------+-----------+-----+
| id | state_id | name      | ... |
+----+----------+-----------+-----+
| .. | ........ | ......... | ... |
| 17 |      130 | San Diego | ... |
| .. | ........ | ......... | ... |
| 25 |       14 | Calgary   | ... |
| .. | ........ | ......... | ... |
+----+----------+-----------+-----+

ISO 3166-1を参照

countries
    id              char(2)(P)
    iso3            char(3)(U)
    iso_num         char(3)(U)
    name            varchar(45)(U)

+----+------+---------+---------------+
| id | iso3 | iso_num | name          |
+----+------+---------+---------------+
| .. | .... | ....... | ............. |
| CA | CAN  | 124     | Canada        |
| .. | .... | ....... | ............. |
| MX | MEX  | 484     | Mexico        |
| .. | .... | ....... | ............. |
| US | USA  | 840     | United States |
| .. | .... | ....... | ............. |
+----+------+---------+---------------+

パスワードのハッシュについては、 PHP の crypt() 関数を参照してください。

customers
    id              unsigned int(P)
    first_name      varchar(50)
    middle_name     varchar(50) // Allow NULL
    last_name       varchar(50)
    email           varchar(255)
    username        varchar(32)
    password        varbinary(255) // hashed
    ...

+----+------------+-------------+-----------+----------------------------+-----------+----------+-----+
| id | first_name | middle_name | last_name | email                      | username  | password | ... |
+----+------------+-------------+-----------+----------------------------+-----------+----------+-----+
|  1 | John       | Quincy      | Public    | jqp@privacy.com            | johnqball | xxxxxxxx | ... |
|  2 | Jane       | NULL        | Doe       | ladyinred@chrisdeburgh.com | janeykins | xxxxxxxx | ... |
| .. | .......... | ........... | ......... | .......................... | ......... | .......  | ... |
+----+------------+-------------+-----------+----------------------------+-----------+----------+-----+

customers_addresses
    id              unsigned int(P)
    customer_id     unsigned int(F customers.id)
    address_id      unsigned int(F addresses.id)

orders
    id                  unsigned int(P)
    customer_id         unsigned int(F customers.id)
    bill_address_id     unsigned int(F addresses.id)
    ship_address_id     unsigned int(F addresses.id)
    created             datetime
    shipped             datetime
    ...

+----+-------------+-----------------+-----------------+---------------------+---------------------+-----+
| id | customer_id | bill_address_id | ship_address_id | created             | shipped             | ... |
+----+-------------+-----------------+-----------------+---------------------+---------------------+-----+
|  1 | 1           | 1               | 1               | 2012-12-31 23:59:59 | 2013-01-01 00:00:00 | ... |
+----+-------------+-----------------+-----------------+---------------------+---------------------+-----+

orders_products
    id              unsigned int(P)
    order_id        unsigned int(F orders.id)
    product_id      unsigned int(F products.id)
    quantity        unsigned int
    unit_price      double
    ...

+----+----------+------------+----------+------------+-----+
| id | order_id | product_id | quantity | unit_price | ... |
+----+----------+------------+----------+------------+-----+
|  1 | 1        | 1          | 1        | 12.34      | ... |
|  2 | 1        | 2          | 13       | 1.78       | ... |
| .. | ........ | .......... | ........ | .......... | ... |
+----+----------+------------+----------+------------+-----+

products
    id                  unsigned int(P)
    name                varchar(50)
    price               double
    ...

+----+----------+-------+-----+
| id | name     | price | ... |
+----+----------+-------+-----+
|  1 | Widget 1 | 12.34 | ... |
|  2 | Widget 2 | 1.78  | ... |
| .. | ........ | ..... | ... |
+----+----------+-------+-----+

returns
    id                      unsigned int(P)
    order_product_id        unsigned int(F orders_products.id)
    quantity                unsigned int
    ...

+----+------------------+----------+-----+
| id | order_product_id | quantity | ... |
+----+------------------+----------+-----+
|  1 | 1                | 1        | ... |
| .. | ................ | ........ | ... |
+----+------------------+----------+-----+

ISO 3166-2を参照

states
    id              unsigned int(P)
    country_id      char(2)(F countries.id)
    code            char(2) // AB, AL, NL, etc.
    name            varchar(50) // Alberta, Alabama, Nuevo Leon, etc.
    ...

+-----+------------+------+------------+-----+
| id  | country_id | code | name       | ... |
+-----+------------+------+------------+-----+
| ... | .......... | .... | .......... | ... |
|  14 | CA         | AB   | Alberta    | ... |
| ... | .......... | .... | .......... | ... |
|  72 | MX         | CH   | Chiapas    | ... |
| ... | .......... | .... | .......... | ... |
| 130 | US         | CA   | California | ... |
| ... | .......... | .... | .......... | ... |
+-----+------------+------+------------+-----+

返品、返金、および交換はすべて実際には返品です。お客様は製品を返品しています。それをどのように処理するかは、ビジネスルールによって異なります...

于 2013-09-04T16:10:17.373 に答える
2

次のような返品と交換を処理するテーブルを作成できます

Returns (ID, OrderID, ExchangeID)

したがって、顧客が何かを返品した場合は、OrderID を Returns に入れれば完了です。顧客が何かを交換した場合は、新しい注文を処理し、返品されたアイテムの OrderID を Returns.OrderID フィールドに入れ、新しい OrderID を Returns に入れます。 .ExchangeID フィールド。これにより、どの製品が何と交換されたかがわかります。これは、無制限の返品と交換を可能にするのに十分な柔軟性を備えている必要があります.

明らかにそれ以上のものがあります - ボールを転がすために頭のてっぺんから考えただけです...

于 2013-09-04T03:23:43.643 に答える
0

混乱を招きかねないので、注文アイテムのライフサイクルという別の概念が必要です。現在、暗黙的に注文アイテムの「有料」ライフサイクルがあります。各アイテムには、実際には、「注文済み」(オンライン ショップなど)、「在庫あり」、「梱包済み」、「発送済み」、「配達済み」など、他のライフサイクルが関連付けられています。

販売後、ライフサイクル ステータスが追加されます。

これを行う最も簡単な方法は、各ライフサイクル ステータスのエントリを持つルックアップ テーブルを作成し、それを LifecycleStatus と呼び、OrderItem テーブルから外部キー列を作成することです。ただし、これでは十分な情報が得られず、あらゆる種類の履歴が失われる可能性があります。

次のステップは、外部キーが OrderItem テーブルにある LifecycleInfo テーブルを追加することです。LifecycleStatus テーブルへの外部キーへの列もあります。このテーブル (たまたま関係テーブルであり、多対多) にも追加の列が必要です。通常、これは少なくとも日付と、何かを説明するための文字列です。

これら 2 つのエンティティにより、1 つの OrderItem 行に複数のステータスを設定し、有用な情報を使用してそのステータスを追跡できます。

これらのエントリを処理するロジックは通常、非常に単純です。たとえば、同じ行で複数の払い戻しが行われないようにするためです。

それが役立つことを願っています。

于 2013-09-04T10:06:24.660 に答える