← 納品物一覧に戻る

データモデル設計書

Version 1.0.0 | CRM(広告代理店向け)

広告代理店向けCRM データモデル設計書


1. 設計方針


2. テーブル一覧

#テーブル名対応機能概要
1tenantsF14テナント(代理店)
2usersF14ユーザー
3rolesF14ロール定義
4permissionsF14権限定義
5role_permissionsF14ロール×権限
6user_rolesF14ユーザー×ロール
7organization_unitsF14組織階層
8clientsF01クライアント企業
9client_contactsF01クライアント担当者
10client_health_scoresF01健全性スコア履歴
11contractsF08契約
12insertion_ordersF08IO(挿入注文)
13invoicesF08請求書
14invoice_line_itemsF08請求書明細
15campaignsF02/F03キャンペーン
16media_platformsF03媒体マスタ
17media_plansF03メディアプラン
18media_plan_itemsF03メディアプラン明細(媒体別予算配分)
19budget_pacingF03予算ペーシング日次実績
20ad_performance_dailyF02広告パフォーマンス日次データ
21kpi_targetsF02KPI 目標値
22creativesF04クリエイティブ素材
23creative_versionsF04クリエイティブバージョン
24approval_workflowsF04承認ワークフロー定義
25approval_stepsF04承認ステップ
26approval_requestsF04承認リクエスト
27approval_actionsF04承認アクション履歴
28agency_feesF05代理店手数料
29revenue_entriesF05収益エントリ
30projectsF07プロジェクト
31tasksF07タスク
32task_commentsF07タスクコメント
33report_configsF06レポート設定
34report_schedulesF06レポート配信スケジュール
35report_executionsF06レポート実行履歴

3. テーブル詳細定義

3.1 tenants(テナント / 代理店)

カラム名制約説明
idUUIDPK, DEFAULT gen_random_uuid()
nameVARCHAR(255)NOT NULL代理店名
slugVARCHAR(100)NOT NULL, UNIQUEURL識別子
planVARCHAR(50)NOT NULL, DEFAULT 'standard'契約プラン
settingsJSONBDEFAULT '{}'テナント設定
is_activeBOOLEANNOT NULL, DEFAULT true
created_atTIMESTAMPTZNOT NULL, DEFAULT now()
updated_atTIMESTAMPTZNOT NULL, DEFAULT now()

インデックス: idx_tenants_slug ON (slug)


3.2 users(ユーザー)

カラム名制約説明
idUUIDPK
tenant_idUUIDNOT NULL, FK → tenants.id
organization_unit_idUUIDFK → organization_units.id所属部署
emailVARCHAR(255)NOT NULL
password_hashVARCHAR(255)NOT NULL
first_nameVARCHAR(100)NOT NULL
last_nameVARCHAR(100)NOT NULL
avatar_urlTEXT
is_activeBOOLEANNOT NULL, DEFAULT true
last_login_atTIMESTAMPTZ
created_atTIMESTAMPTZNOT NULL, DEFAULT now()
updated_atTIMESTAMPTZNOT NULL, DEFAULT now()
deleted_atTIMESTAMPTZ論理削除

インデックス:


3.3 roles(ロール)

カラム名制約説明
idUUIDPK
tenant_idUUIDNOT NULL, FK → tenants.id
nameVARCHAR(100)NOT NULL例: admin, manager, member
descriptionTEXT
is_systemBOOLEANNOT NULL, DEFAULT falseシステム定義ロール
created_atTIMESTAMPTZNOT NULL, DEFAULT now()
updated_atTIMESTAMPTZNOT NULL, DEFAULT now()

インデックス: idx_roles_tenant_name UNIQUE ON (tenant_id, name)


3.4 permissions(権限)

カラム名制約説明
idUUIDPK
resourceVARCHAR(100)NOT NULL例: clients, campaigns
actionVARCHAR(50)NOT NULL例: read, write, delete
descriptionTEXT

インデックス: idx_permissions_resource_action UNIQUE ON (resource, action)


3.5 role_permissions(ロール×権限)

カラム名制約説明
role_idUUIDPK(複合), FK → roles.id
permission_idUUIDPK(複合), FK → permissions.id

3.6 user_roles(ユーザー×ロール)

カラム名制約説明
user_idUUIDPK(複合), FK → users.id
role_idUUIDPK(複合), FK → roles.id
assigned_atTIMESTAMPTZNOT NULL, DEFAULT now()

3.7 organization_units(組織階層)

カラム名制約説明
idUUIDPK
tenant_idUUIDNOT NULL, FK → tenants.id
parent_idUUIDFK → organization_units.id親部署(NULLならルート)
nameVARCHAR(255)NOT NULL部署名
levelINTNOT NULL, DEFAULT 0階層レベル
sort_orderINTNOT NULL, DEFAULT 0表示順
created_atTIMESTAMPTZNOT NULL, DEFAULT now()
updated_atTIMESTAMPTZNOT NULL, DEFAULT now()

インデックス:


3.8 clients(クライアント企業)

カラム名制約説明
idUUIDPK
tenant_idUUIDNOT NULL, FK → tenants.id
nameVARCHAR(255)NOT NULL企業名
industryVARCHAR(100)業種
websiteTEXT
phoneVARCHAR(50)
addressTEXT
account_manager_idUUIDFK → users.id担当AM
statusVARCHAR(30)NOT NULL, DEFAULT 'active'active/churned/prospect
tierVARCHAR(20)DEFAULT 'standard'premium/standard/small
notesTEXT
created_atTIMESTAMPTZNOT NULL, DEFAULT now()
updated_atTIMESTAMPTZNOT NULL, DEFAULT now()
deleted_atTIMESTAMPTZ

インデックス:


3.9 client_contacts(クライアント担当者)

カラム名制約説明
idUUIDPK
tenant_idUUIDNOT NULL, FK → tenants.id
client_idUUIDNOT NULL, FK → clients.id
first_nameVARCHAR(100)NOT NULL
last_nameVARCHAR(100)NOT NULL
emailVARCHAR(255)
phoneVARCHAR(50)
job_titleVARCHAR(150)役職
is_primaryBOOLEANNOT NULL, DEFAULT false主担当フラグ
created_atTIMESTAMPTZNOT NULL, DEFAULT now()
updated_atTIMESTAMPTZNOT NULL, DEFAULT now()
deleted_atTIMESTAMPTZ

インデックス:


3.10 client_health_scores(健全性スコア履歴)

カラム名制約説明
idUUIDPK
tenant_idUUIDNOT NULL, FK → tenants.id
client_idUUIDNOT NULL, FK → clients.id
scoreINTNOT NULL, CHECK(score BETWEEN 0 AND 100)0-100
dimension_scoresJSONBDEFAULT '{}'各観点別スコア
calculated_atTIMESTAMPTZNOT NULL, DEFAULT now()算出日時
notesTEXT

インデックス:


3.11 contracts(契約)

カラム名制約説明
idUUIDPK
tenant_idUUIDNOT NULL, FK → tenants.id
client_idUUIDNOT NULL, FK → clients.id
contract_numberVARCHAR(50)NOT NULL契約番号
titleVARCHAR(255)NOT NULL
statusVARCHAR(30)NOT NULL, DEFAULT 'draft'draft/active/expired/terminated
start_dateDATENOT NULL
end_dateDATENOT NULL
auto_renewBOOLEANNOT NULL, DEFAULT false
total_valueDECIMAL(15,2)契約総額
currencyVARCHAR(3)NOT NULL, DEFAULT 'JPY'
payment_termsVARCHAR(100)支払条件(例: NET30)
terms_and_conditionsTEXT契約条件
signed_atTIMESTAMPTZ署名日時
created_atTIMESTAMPTZNOT NULL, DEFAULT now()
updated_atTIMESTAMPTZNOT NULL, DEFAULT now()
deleted_atTIMESTAMPTZ

インデックス:


3.12 insertion_orders(IO: 挿入注文)

カラム名制約説明
idUUIDPK
tenant_idUUIDNOT NULL, FK → tenants.id
contract_idUUIDNOT NULL, FK → contracts.id
io_numberVARCHAR(50)NOT NULLIO番号
titleVARCHAR(255)NOT NULL
statusVARCHAR(30)NOT NULL, DEFAULT 'draft'draft/approved/active/completed
start_dateDATENOT NULL
end_dateDATENOT NULL
total_budgetDECIMAL(15,2)NOT NULL総予算
currencyVARCHAR(3)NOT NULL, DEFAULT 'JPY'
approved_by_idUUIDFK → users.id
approved_atTIMESTAMPTZ
created_atTIMESTAMPTZNOT NULL, DEFAULT now()
updated_atTIMESTAMPTZNOT NULL, DEFAULT now()

インデックス:


3.13 invoices(請求書)

カラム名制約説明
idUUIDPK
tenant_idUUIDNOT NULL, FK → tenants.id
client_idUUIDNOT NULL, FK → clients.id
contract_idUUIDFK → contracts.id
invoice_numberVARCHAR(50)NOT NULL
statusVARCHAR(30)NOT NULL, DEFAULT 'draft'draft/sent/paid/overdue/void
issue_dateDATENOT NULL
due_dateDATENOT NULL
subtotalDECIMAL(15,2)NOT NULL小計
tax_rateDECIMAL(5,4)NOT NULL, DEFAULT 0.10税率
tax_amountDECIMAL(15,2)NOT NULL税額
total_amountDECIMAL(15,2)NOT NULL合計
currencyVARCHAR(3)NOT NULL, DEFAULT 'JPY'
paid_atTIMESTAMPTZ入金日
notesTEXT
created_atTIMESTAMPTZNOT NULL, DEFAULT now()
updated_atTIMESTAMPTZNOT NULL, DEFAULT now()

インデックス:


3.14 invoice_line_items(請求書明細)

カラム名制約説明
idUUIDPK
tenant_idUUIDNOT NULL, FK → tenants.id
invoice_idUUIDNOT NULL, FK → invoices.id
descriptionTEXTNOT NULL
quantityDECIMAL(10,2)NOT NULL, DEFAULT 1
unit_priceDECIMAL(15,2)NOT NULL
amountDECIMAL(15,2)NOT NULL
campaign_idUUIDFK → campaigns.id紐付けキャンペーン
sort_orderINTNOT NULL, DEFAULT 0

インデックス:


3.15 campaigns(キャンペーン)

カラム名制約説明
idUUIDPK
tenant_idUUIDNOT NULL, FK → tenants.id
client_idUUIDNOT NULL, FK → clients.id
insertion_order_idUUIDFK → insertion_orders.id
nameVARCHAR(255)NOT NULL
statusVARCHAR(30)NOT NULL, DEFAULT 'draft'draft/active/paused/completed
objectiveVARCHAR(100)awareness/conversion/traffic等
start_dateDATENOT NULL
end_dateDATENOT NULL
total_budgetDECIMAL(15,2)NOT NULL
currencyVARCHAR(3)NOT NULL, DEFAULT 'JPY'
owner_idUUIDFK → users.id運用担当者
created_atTIMESTAMPTZNOT NULL, DEFAULT now()
updated_atTIMESTAMPTZNOT NULL, DEFAULT now()
deleted_atTIMESTAMPTZ

インデックス:


3.16 media_platforms(媒体マスタ)

カラム名制約説明
idUUIDPK
nameVARCHAR(100)NOT NULL, UNIQUEGoogle Ads, Meta Ads, LINE等
platform_typeVARCHAR(50)NOT NULLsearch/social/display/video
api_supportedBOOLEANNOT NULL, DEFAULT falseAPI連携可否
is_activeBOOLEANNOT NULL, DEFAULT true
created_atTIMESTAMPTZNOT NULL, DEFAULT now()

※ テナント共通マスタ(tenant_id なし)


3.17 media_plans(メディアプラン)

カラム名制約説明
idUUIDPK
tenant_idUUIDNOT NULL, FK → tenants.id
campaign_idUUIDNOT NULL, FK → campaigns.id
nameVARCHAR(255)NOT NULL
versionINTNOT NULL, DEFAULT 1プランバージョン
statusVARCHAR(30)NOT NULL, DEFAULT 'draft'draft/approved/active
total_budgetDECIMAL(15,2)NOT NULL
currencyVARCHAR(3)NOT NULL, DEFAULT 'JPY'
approved_by_idUUIDFK → users.id
approved_atTIMESTAMPTZ
created_atTIMESTAMPTZNOT NULL, DEFAULT now()
updated_atTIMESTAMPTZNOT NULL, DEFAULT now()

インデックス:


3.18 media_plan_items(メディアプラン明細)

カラム名制約説明
idUUIDPK
tenant_idUUIDNOT NULL, FK → tenants.id
media_plan_idUUIDNOT NULL, FK → media_plans.id
media_platform_idUUIDNOT NULL, FK → media_platforms.id
ad_formatVARCHAR(100)広告フォーマット
allocated_budgetDECIMAL(15,2)NOT NULL配分予算
target_impressionsBIGINT目標imp
target_clicksBIGINT目標click
target_conversionsBIGINT目標CV
target_cpaDECIMAL(15,2)目標CPA
target_roasDECIMAL(8,4)目標ROAS
start_dateDATENOT NULL
end_dateDATENOT NULL
notesTEXT

インデックス:


3.19 budget_pacing(予算ペーシング日次実績)

カラム名制約説明
idUUIDPK
tenant_idUUIDNOT NULL, FK → tenants.id
campaign_idUUIDNOT NULL, FK → campaigns.id
media_platform_idUUIDNOT NULL, FK → media_platforms.id
dateDATENOT NULL
planned_spendDECIMAL(15,2)NOT NULL計画消化額
actual_spendDECIMAL(15,2)NOT NULL, DEFAULT 0実績消化額
cumulative_plannedDECIMAL(15,2)NOT NULL計画累計
cumulative_actualDECIMAL(15,2)NOT NULL, DEFAULT 0実績累計
pacing_ratioDECIMAL(8,4)実績/計画 比率

インデックス:


3.20 ad_performance_daily(広告パフォーマンス日次データ)

カラム名制約説明
idUUIDPK
tenant_idUUIDNOT NULL, FK → tenants.id
campaign_idUUIDNOT NULL, FK → campaigns.id
media_platform_idUUIDNOT NULL, FK → media_platforms.id
dateDATENOT NULL
impressionsBIGINTNOT NULL, DEFAULT 0
clicksBIGINTNOT NULL, DEFAULT 0
conversionsBIGINTNOT NULL, DEFAULT 0
spendDECIMAL(15,2)NOT NULL, DEFAULT 0消化額
revenueDECIMAL(15,2)NOT NULL, DEFAULT 0売上(ROAS算出用)
video_viewsBIGINTDEFAULT 0
engagementsBIGINTDEFAULT 0
extra_metricsJSONBDEFAULT '{}'媒体固有指標

算出KPI(ビューまたはアプリ側で計算):

インデックス:


3.21 kpi_targets(KPI目標値)

カラム名制約説明
idUUIDPK
tenant_idUUIDNOT NULL, FK → tenants.id
campaign_idUUIDNOT NULL, FK → campaigns.id
period_startDATENOT NULL対象期間開始
period_endDATENOT NULL対象期間終了
target_cpaDECIMAL(15,2)
target_roasDECIMAL(8,4)
target_ctrDECIMAL(8,6)
target_cvrDECIMAL(8,6)
target_spendDECIMAL(15,2)
created_atTIMESTAMPTZNOT NULL, DEFAULT now()

インデックス:


3.22 creatives(クリエイティブ素材)

カラム名制約説明
idUUIDPK
tenant_idUUIDNOT NULL, FK → tenants.id
campaign_idUUIDNOT NULL, FK → campaigns.id
nameVARCHAR(255)NOT NULL
creative_typeVARCHAR(50)NOT NULLimage/video/text/html
statusVARCHAR(30)NOT NULL, DEFAULT 'draft'draft/in_review/approved/rejected
current_version_idUUIDFK → creative_versions.id最新バージョン
created_atTIMESTAMPTZNOT NULL, DEFAULT now()
updated_atTIMESTAMPTZNOT NULL, DEFAULT now()
deleted_atTIMESTAMPTZ

インデックス:


3.23 creative_versions(クリエイティブバージョン)

カラム名制約説明
idUUIDPK
tenant_idUUIDNOT NULL, FK → tenants.id
creative_idUUIDNOT NULL, FK → creatives.id
version_numberINTNOT NULL
file_urlTEXTNOT NULLストレージURL
file_size_bytesBIGINT
mime_typeVARCHAR(100)
widthINT
heightINT
duration_secondsDECIMAL(8,2)動画の場合
headlineVARCHAR(255)
body_textTEXT
metadataJSONBDEFAULT '{}'
uploaded_by_idUUIDNOT NULL, FK → users.id
created_atTIMESTAMPTZNOT NULL, DEFAULT now()

インデックス:


3.24 approval_workflows(承認ワークフロー定義)

カラム名制約説明
idUUIDPK
tenant_idUUIDNOT NULL, FK → tenants.id
nameVARCHAR(255)NOT NULL
target_typeVARCHAR(50)NOT NULLcreative/media_plan/io
is_activeBOOLEANNOT NULL, DEFAULT true
created_atTIMESTAMPTZNOT NULL, DEFAULT now()
updated_atTIMESTAMPTZNOT NULL, DEFAULT now()

3.25 approval_steps(承認ステップ)

カラム名制約説明
idUUIDPK
tenant_idUUIDNOT NULL, FK → tenants.id
workflow_idUUIDNOT NULL, FK → approval_workflows.id
step_orderINTNOT NULL順序
approver_role_idUUIDFK → roles.id承認ロール
approver_user_idUUIDFK → users.id指名承認者
is_requiredBOOLEANNOT NULL, DEFAULT true

インデックス:


3.26 approval_requests(承認リクエスト)

カラム名制約説明
idUUIDPK
tenant_idUUIDNOT NULL, FK → tenants.id
workflow_idUUIDNOT NULL, FK → approval_workflows.id
target_typeVARCHAR(50)NOT NULLcreative_version/media_plan/io
target_idUUIDNOT NULL対象レコードのID
statusVARCHAR(30)NOT NULL, DEFAULT 'pending'pending/approved/rejected/cancelled
requested_by_idUUIDNOT NULL, FK → users.id
current_step_orderINTNOT NULL, DEFAULT 1
created_atTIMESTAMPTZNOT NULL, DEFAULT now()
updated_atTIMESTAMPTZNOT NULL, DEFAULT now()

インデックス:


3.27 approval_actions(承認アクション履歴)

カラム名制約説明
idUUIDPK
tenant_idUUIDNOT NULL, FK → tenants.id
approval_request_idUUIDNOT NULL, FK → approval_requests.id
step_idUUIDNOT NULL, FK → approval_steps.id
actionVARCHAR(30)NOT NULLapproved/rejected/commented
commentTEXT
acted_by_idUUIDNOT NULL, FK → users.id
acted_atTIMESTAMPTZNOT NULL, DEFAULT now()

インデックス:


3.28 agency_fees(代理店手数料)

カラム名制約説明
idUUIDPK
tenant_idUUIDNOT NULL, FK → tenants.id
client_idUUIDNOT NULL, FK → clients.id
contract_idUUIDFK → contracts.id
campaign_idUUIDFK → campaigns.id
fee_typeVARCHAR(50)NOT NULLmargin_rate/fixed/performance
margin_rateDECIMAL(5,4)マージン率(例: 0.2000 = 20%)
fixed_amountDECIMAL(15,2)固定手数料
performance_thresholdJSONB成果報酬条件
effective_fromDATENOT NULL
effective_toDATE
currencyVARCHAR(3)NOT NULL, DEFAULT 'JPY'
created_atTIMESTAMPTZNOT NULL, DEFAULT now()
updated_atTIMESTAMPTZNOT NULL, DEFAULT now()

インデックス:


3.29 revenue_entries(収益エントリ)

カラム名制約説明
idUUIDPK
tenant_idUUIDNOT NULL, FK → tenants.id
client_idUUIDNOT NULL, FK → clients.id
campaign_idUUIDFK → campaigns.id
period_yearINTNOT NULL
period_monthINTNOT NULL, CHECK(1-12)
gross_revenueDECIMAL(15,2)NOT NULL粗利益(媒体費込み)
media_costDECIMAL(15,2)NOT NULL媒体原価
agency_feeDECIMAL(15,2)NOT NULL代理店手数料
other_costsDECIMAL(15,2)NOT NULL, DEFAULT 0その他原価
net_profitDECIMAL(15,2)NOT NULL純利益
currencyVARCHAR(3)NOT NULL, DEFAULT 'JPY'
created_atTIMESTAMPTZNOT NULL, DEFAULT now()
updated_atTIMESTAMPTZNOT NULL, DEFAULT now()

インデックス:


3.30 projects(プロジェクト)

カラム名制約説明
idUUIDPK
tenant_idUUIDNOT NULL, FK → tenants.id
client_idUUIDNOT NULL, FK → clients.id
campaign_idUUIDFK → campaigns.id
nameVARCHAR(255)NOT NULL
descriptionTEXT
statusVARCHAR(30)NOT NULL, DEFAULT 'active'active/completed/on_hold/cancelled
start_dateDATE
due_dateDATE
owner_idUUIDFK → users.id
created_atTIMESTAMPTZNOT NULL, DEFAULT now()
updated_atTIMESTAMPTZNOT NULL, DEFAULT now()
deleted_atTIMESTAMPTZ

インデックス:


3.31 tasks(タスク)

カラム名制約説明
idUUIDPK
tenant_idUUIDNOT NULL, FK → tenants.id
project_idUUIDNOT NULL, FK → projects.id
parent_task_idUUIDFK → tasks.id親タスク(サブタスク用)
titleVARCHAR(255)NOT NULL
descriptionTEXT
statusVARCHAR(30)NOT NULL, DEFAULT 'todo'todo/in_progress/in_review/done
priorityVARCHAR(20)NOT NULL, DEFAULT 'medium'low/medium/high/urgent
assignee_idUUIDFK → users.id
due_dateDATE
estimated_hoursDECIMAL(6,2)
actual_hoursDECIMAL(6,2)
sort_orderINTNOT NULL, DEFAULT 0
created_atTIMESTAMPTZNOT NULL, DEFAULT now()
updated_atTIMESTAMPTZNOT NULL, DEFAULT now()
deleted_atTIMESTAMPTZ

インデックス:


3.32 task_comments(タスクコメント)

カラム名制約説明
idUUIDPK
tenant_idUUIDNOT NULL, FK → tenants.id
task_idUUIDNOT NULL, FK → tasks.id
user_idUUIDNOT NULL, FK → users.id
bodyTEXTNOT NULL
created_atTIMESTAMPTZNOT NULL, DEFAULT now()
updated_atTIMESTAMPTZNOT NULL, DEFAULT now()

インデックス:


3.33 report_configs(レポート設定)

カラム名制約説明
idUUIDPK
tenant_idUUIDNOT NULL, FK → tenants.id
nameVARCHAR(255)NOT NULL
report_typeVARCHAR(50)NOT NULLperformance/budget/creative/pl
client_idUUIDFK → clients.id
campaign_idsUUID[]対象キャンペーン群
metricsTEXT[]NOT NULL含める指標
dimensionsTEXT[]NOT NULL集計軸
filtersJSONBDEFAULT '{}'フィルタ条件
template_configJSONBDEFAULT '{}'テンプレート設定
output_formatVARCHAR(20)NOT NULL, DEFAULT 'pdf'pdf/excel/google_slides
created_by_idUUIDNOT NULL, FK → users.id
created_atTIMESTAMPTZNOT NULL, DEFAULT now()
updated_atTIMESTAMPTZNOT NULL, DEFAULT now()

インデックス:


3.34 report_schedules(レポート配信スケジュール)

カラム名制約説明
idUUIDPK
tenant_idUUIDNOT NULL, FK → tenants.id
report_config_idUUIDNOT NULL, FK → report_configs.id
frequencyVARCHAR(30)NOT NULLdaily/weekly/monthly/quarterly
cron_expressionVARCHAR(100)cron式
day_of_weekINT0-6(weekly時)
day_of_monthINT1-31(monthly時)
time_of_dayTIMENOT NULL, DEFAULT '09:00'配信時刻
timezoneVARCHAR(50)NOT NULL, DEFAULT 'Asia/Tokyo'
recipientsJSONBNOT NULL配信先リスト
is_activeBOOLEANNOT NULL, DEFAULT true
next_run_atTIMESTAMPTZ次回実行予定
created_atTIMESTAMPTZNOT NULL, DEFAULT now()
updated_atTIMESTAMPTZNOT NULL, DEFAULT now()

インデックス:


3.35 report_executions(レポート実行履歴)

カラム名制約説明
idUUIDPK
tenant_idUUIDNOT NULL, FK → tenants.id
report_config_idUUIDNOT NULL, FK → report_configs.id
schedule_idUUIDFK → report_schedules.id手動実行時はNULL
statusVARCHAR(30)NOT NULLqueued/running/completed/failed
started_atTIMESTAMPTZ
completed_atTIMESTAMPTZ
output_urlTEXT生成ファイルURL
error_messageTEXT
triggered_by_idUUIDFK → users.id
created_atTIMESTAMPTZNOT NULL, DEFAULT now()

インデックス:


4. ER図

※ この図はシステム構成図です。詳細は別途ご説明いたします。


5. 推奨ビュー / マテリアライズドビュー

v_campaign_kpi_summary (マテリアライズドビュー):

v_client_pl_summary (ビュー):

v_budget_pacing_status (ビュー):


6. RLS ポリシー設計

全テーブル(media_platforms, permissions を除く)に対して以下の RLS ポリシーを適用:

-- 例: clients テーブル
ALTER TABLE clients ENABLE ROW LEVEL SECURITY;

CREATE POLICY tenant_isolation ON clients
    USING (tenant_id = current_setting('app.current_tenant_id')::uuid);

アプリケーション層(Prisma ミドルウェア)でリクエストごとに SET LOCAL app.current_tenant_id = '<uuid>' を発行する。