asopi tech
asopi techIndie Developer

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を、ショップの土台としておすすめします。クイックスタートから始められます。

関連リンク