Asopitech With · ネットショップ
Shopify with Alopex DB
Shopifyは、ネットショップを作って運営するサービスです。これをAlopex DBを使って再現すると…?
更新: 2026/10/12
どんなサービスか
Shopifyは、ネットショップを作って運営するサービスです。商品には説明、画像、価格、在庫、バリエーション、タグを付け、サイズや色の組み合わせごとに在庫を管理します。扱うデータは、商品、バリエーション、在庫、注文、顧客です。
データの置き場所
- SQLテーブル:商品、バリエーション、在庫、注文、顧客をテーブルに持ちます。
- JSON:商品ごとに違う属性を、JSONの列に持ちます。
- ベクトル:商品の説明と画像の埋め込みをベクトル列に持ち、似た商品のおすすめに使います。
- カラムナーテーブル:注文の明細をカラムナーテーブルにも持ち、日ごと、商品ごとの売上を集計します。
注文の確定と在庫の引き当ては、同じトランザクションでコミットします。
配置の形
Alopex DBをサーバーとして動かし、ショップの画面と管理画面にHTTPとgRPCで返します。ショップが増えたら、Alopex DBのクラスタに広げます。
Alopex DBが合う理由
ネットショップは、注文と在庫を正しく扱い、そのうえで売れる提案をすることが要です。Alopex DBは、トランザクション、ベクトル、カラムナーの集計を1つのデータベースで扱えます。
コードで見る
商品・在庫・注文を持ち、注文の確定と在庫の引き当てを同じトランザクションで行い、似た商品をベクトルでおすすめします。中心だけを取り出したコードです。
import alopex
import numpy as np
db = alopex.Database.open("shopify.alopex")
db.execute_sql("""
CREATE TABLE IF NOT EXISTS products (
id INTEGER PRIMARY KEY,
title TEXT,
price INTEGER,
embedding VECTOR(4)
)
""")
db.execute_sql("CREATE TABLE IF NOT EXISTS inventory (product_id INTEGER, stock INTEGER)")
db.execute_sql("CREATE TABLE IF NOT EXISTS orders (id INTEGER PRIMARY KEY, product_id INTEGER, qty INTEGER)")
products = [
(1, "青いTシャツ", 2000, [0.9, 0.1, 0.0, 0.0]),
(2, "赤いTシャツ", 2000, [0.85, 0.15, 0.0, 0.0]),
(3, "革の財布", 8000, [0.0, 0.0, 0.9, 0.1]),
]
for pid, title, price, emb in products:
db.execute_sql("INSERT INTO products (id, title, price, embedding) VALUES (?, ?, ?, ?)", [pid, title, price, np.array(emb, dtype=np.float32)])
db.execute_sql("INSERT INTO inventory (product_id, stock) VALUES (?, ?)", [pid, 10])
# 注文の確定と在庫の引き当てを、同じトランザクションでコミットする
tx = db.begin(alopex.TxnMode.READ_WRITE)
try:
tx.execute_sql("INSERT INTO orders (id, product_id, qty) VALUES (?, ?, ?)", [1, 1, 3])
tx.execute_sql("UPDATE inventory SET stock = stock - ? WHERE product_id = ?", [3, 1])
tx.commit()
except Exception:
tx.rollback()
raise
print("在庫:", db.execute_sql("SELECT stock FROM inventory WHERE product_id = ?", [1])[0]["stock"])
# 「青いTシャツ」に似た商品を、ベクトルでおすすめする
query = np.array([0.9, 0.1, 0.0, 0.0], dtype=np.float32)
rows = db.execute_sql("""
SELECT title, vector_similarity(embedding, ?, 'cosine') AS score
FROM products
WHERE id <> ?
ORDER BY score DESC
LIMIT 1
""", [query, 1])
for row in rows:
print("おすすめ:", round(row["score"], 3), row["title"])注文と在庫がひとつのトランザクションでそろい、そのうえで似た商品のおすすめを同じSQLで出せます。
トランザクション、ベクトル、カラムナーの集計を一つのデータベースで扱えるAlopex DBを、ショップの土台としておすすめします。クイックスタートから始められます。