577 lines
39 KiB
JavaScript
577 lines
39 KiB
JavaScript
// ═══════════════════════════════════════════════════════════════════════════
|
||
// ADB COMPARISON TOOL — EXTERNAL DATA FILE (v2 — 5 flavors)
|
||
// ═══════════════════════════════════════════════════════════════════════════
|
||
//
|
||
// Two deployment worlds, five flavors:
|
||
//
|
||
// SERVERLESS (Oracle-managed shared infrastructure)
|
||
// [0] Serverless — standalone pay-per-use
|
||
// [1] Elastic Pool — pooled compute, shared infra
|
||
// [2] Ded. Elastic Pool — pooled compute+storage, co-located infra
|
||
//
|
||
// DEDICATED (Customer-exclusive Exadata infrastructure)
|
||
// [3] ADB Dedicated — standalone Exadata
|
||
// [4] Dedicated EP (Exa) — elastic pool on Exadata
|
||
//
|
||
// Every array in this file follows this 5-element order:
|
||
// [Serverless, Elastic Pool, Ded.EP(Svl), ADB Dedicated, Ded.EP(Exa)]
|
||
//
|
||
// ═══════════════════════════════════════════════════════════════════════════
|
||
|
||
const FLAVORS = [
|
||
{ name: "Serverless", cls: "shared", short: "Serverless", group: "serverless" },
|
||
{ name: "Elastic Pool", cls: "spool", short: "Elastic Pool", group: "serverless" },
|
||
{ name: "Ded. Elastic Pool", cls: "pool", short: "Ded. EP (Svl)", group: "serverless" },
|
||
{ name: "ADB Dedicated", cls: "dedicated", short: "ADB Dedicated", group: "dedicated" },
|
||
{ name: "Elastic Pool (Dedicated)", cls: "dedpool", short: "EP (Dedicated)", group: "dedicated" }
|
||
];
|
||
|
||
|
||
const DOC_LINKS = {
|
||
shared: "https://docs.oracle.com/en/cloud/paas/autonomous-database/serverless/adbsb/autonomous-features-billing.html",
|
||
spool: "https://docs.oracle.com/en-us/iaas/autonomous-database-serverless/doc/elastic-pools-about.html",
|
||
pool: "https://docs.oracle.com/en-us/iaas/autonomous-database-serverless/doc/dedicated-elastic-pools.html",
|
||
dedicated: "https://docs.oracle.com/en/cloud/paas/autonomous-database/dedicated/adbd-index.html",
|
||
dedpool: "https://docs.oracle.com/en/cloud/paas/autonomous-database/dedicated/catiu/index.html"
|
||
};
|
||
|
||
|
||
// ═══════════════════════════════════════════════════════════════════════════
|
||
// INFO TOOLTIPS — (i) button per criterion
|
||
// ═══════════════════════════════════════════════════════════════════════════
|
||
// flavors: [Serverless, Elastic Pool, Ded.EP(Svl), ADB Dedicated, Ded.EP(Exa)]
|
||
// ═══════════════════════════════════════════════════════════════════════════
|
||
|
||
const INFO = {
|
||
"Consistency": {
|
||
desc: "Likelihood that performance remains stable under load and over time (reduced variance/jitter).",
|
||
flavors: [
|
||
"Good, but shared multi-tenant platform can imply higher variance; potential light noisy-neighbor impact.",
|
||
"Better than standalone Serverless: pool-level resource management reduces per-DB variance, but still on shared infrastructure.",
|
||
"Higher: tenant-dedicated platform reduces noisy-neighbor risk, but internal contention can occur if pool overcommitted.",
|
||
"Highest: dedicated Exadata infrastructure provides the strongest predictability for mission-critical workloads.",
|
||
"High: dedicated Exadata with pool-level resource management. Predictable infra but pool contention possible if overcommitted."
|
||
]
|
||
},
|
||
"Isolation": {
|
||
desc: "Degree of separation from other tenants and workloads — security, blast radius, compliance (LGPD/GDPR, data sovereignty).",
|
||
flavors: [
|
||
"Good (OCI standards), but multi-tenant shared resources. Suitable for non-regulated workloads.",
|
||
"Same shared infrastructure as Serverless but pool provides a logical grouping boundary for your DBs.",
|
||
"Excellent: fully dedicated single-tenant (compute, storage, network isolated). Ideal for LGPD/GDPR, data sovereignty.",
|
||
"Highest: dedicated Exadata infrastructure; strongest isolation for regulated industries and compliance mandates.",
|
||
"Very high: Exadata-level isolation with pool members co-located on same infrastructure. Strong compliance posture."
|
||
]
|
||
},
|
||
"List-cost fit": {
|
||
desc: "Fixed/minimum cost you incur even at low utilization (cost floor / baseline commitment).",
|
||
flavors: [
|
||
"Lowest: pure pay-per-use, no fixed infra. Auto-pause saves 100% compute when idle. Free developer tier.",
|
||
"Low pool shapes (128 ECPUs min). No dedicated infra floor. Storage billed per-DB.",
|
||
"Higher: pool minimums apply (256 ECPUs / 256 TB base), plus dedicated tenancy overhead.",
|
||
"Highest: dedicated Exadata infrastructure baseline; justified by risk/SLAs/compliance.",
|
||
"High: Exadata infra cost + pool shape minimum (128 ECPUs). Pool billing can reduce compute costs vs standalone Dedicated."
|
||
]
|
||
},
|
||
"Fully managed": {
|
||
desc: "Degree of operational automation — patching, backup, scaling, provisioning.",
|
||
flavors: [
|
||
"Fully autonomous: Oracle manages everything, auto-patching on Oracle schedule. Zero admin.",
|
||
"Fully managed like Serverless. Pool leader/member operations are simple join/leave.",
|
||
"Mostly managed: you can control patching windows (pause up to 4 weeks) and custom maintenance schedules.",
|
||
"Fleet admin manages Exadata infra, AVMCs, and ACDs. More operational responsibility but full control.",
|
||
"Fleet admin manages Exadata; pool leader manages pool membership. Patching control + pool simplicity."
|
||
]
|
||
},
|
||
"Elasticity": {
|
||
desc: "Ability to dynamically scale compute and storage without downtime or re-provisioning.",
|
||
flavors: [
|
||
"Excellent: auto-scaling up to 3× base ECPUs. Scale-to-zero with auto-pause. Instant provisioning.",
|
||
"Good: pool can burst to 4× pool shape. Individual DBs can be 1 ECPU min. No per-DB auto-scaling.",
|
||
"Good: pool can burst to 4× shape. Additionally pool leader can scale both compute and storage shapes.",
|
||
"Manual ECPU scaling per AVM cluster. No auto-scaling. Adding servers requires infrastructure change.",
|
||
"Good: pool can burst to 4× shape on Exadata. Better elasticity than standalone Dedicated."
|
||
]
|
||
},
|
||
"Consolidation TCO": {
|
||
desc: "Total cost of ownership when consolidating 25+ databases under a single billing umbrella.",
|
||
flavors: [
|
||
"Weak: each DB billed independently; costs scale linearly. No consolidation discount mechanism.",
|
||
"Best: pool absorbs per-DB minimums. Up to 87% compute savings. 1 ECPU min/DB vs 2 ECPU standalone.",
|
||
"Excellent: compute + storage consolidated to leader. Single bill. Ideal for SaaS with many small DBs.",
|
||
"Moderate: compute billed per-AVMC aggregate. Infra costs amortized over more DBs but high floor.",
|
||
"Strong: pool billing on Exadata — up to 87% compute savings same as Serverless EP. Infra costs still apply."
|
||
]
|
||
},
|
||
"Portability": {
|
||
desc: "Ease of moving databases between pools, regions, or deployment models.",
|
||
flavors: [
|
||
"Excellent: clone, move between regions. Simple scale up/down. No pool dependencies.",
|
||
"Excellent: easy join/leave pool. Clone in/out. Pool members don't need same infrastructure.",
|
||
"Good: pool members must be on same infrastructure. Join/leave operations available. Cross-region limited.",
|
||
"Moderate: databases tied to Exadata infrastructure. Cross-region requires Data Guard setup.",
|
||
"Moderate: pool members co-located on same Exadata. Join/leave pool available. Infrastructure-bound."
|
||
]
|
||
},
|
||
"Governance": {
|
||
desc: "Administrative control over patching schedules, maintenance windows, access policies, and fleet operations.",
|
||
flavors: [
|
||
"Limited: Oracle controls patching schedule. No custom maintenance windows. Basic IAM integration.",
|
||
"Limited: same as Serverless. Pool leader can manage membership. Custom maintenance with 1024+ pool shape.",
|
||
"Good: custom patching windows. Pause updates up to 4 weeks. Dedicated maintenance scheduling.",
|
||
"Full: fleet admin controls patching, maintenance, and lifecycle for all infra components.",
|
||
"Strong: fleet admin controls Exadata + pool leader manages pool. Custom patching + pool governance."
|
||
]
|
||
},
|
||
};
|
||
|
||
|
||
// ═══════════════════════════════════════════════════════════════════════════
|
||
// DECISION MATRIX — 8 pre-built scenarios
|
||
// ═══════════════════════════════════════════════════════════════════════════
|
||
// scores: [Serverless, Elastic Pool, Ded.EP(Svl), ADB Dedicated, Ded.EP(Exa)]
|
||
// ═══════════════════════════════════════════════════════════════════════════
|
||
|
||
const matrices = {
|
||
small: {
|
||
title: "Small — 5 DBs, low steady usage",
|
||
desc: "Cost-sensitive; fast time-to-value; minimal admin overhead",
|
||
criteria: [
|
||
{ name: "List-cost fit", weight: 95, scores: [5, 4, 2, 2, 2] },
|
||
{ name: "Fully managed", weight: 80, scores: [5, 5, 5, 4, 4] },
|
||
{ name: "Elasticity", weight: 50, scores: [5, 4, 3, 3, 3] },
|
||
{ name: "Portability", weight: 40, scores: [5, 5, 5, 3, 3] },
|
||
{ name: "Consolidation TCO", weight: 10, scores: [3, 4, 3, 2, 3] },
|
||
{ name: "Consistency", weight: 30, scores: [3, 3, 4, 5, 4] },
|
||
{ name: "Isolation", weight: 15, scores: [2, 2, 4, 5, 5] },
|
||
{ name: "Governance", weight: 10, scores: [2, 2, 3, 5, 4] },
|
||
],
|
||
weights: [95, 80, 50, 40, 10, 30, 15, 10, 10, 5]
|
||
},
|
||
consolidated: {
|
||
title: "Consolidated — ~25 medium DBs",
|
||
desc: "Pooling compute savings; reduce per-DB billing overhead",
|
||
criteria: [
|
||
{ name: "Consolidation TCO", weight: 95, scores: [2, 5, 5, 3, 4] },
|
||
{ name: "List-cost fit", weight: 70, scores: [4, 4, 3, 2, 3] },
|
||
{ name: "Portability", weight: 60, scores: [5, 5, 5, 3, 3] },
|
||
{ name: "Fully managed", weight: 50, scores: [5, 5, 5, 4, 4] },
|
||
{ name: "Elasticity", weight: 45, scores: [5, 4, 4, 3, 4] },
|
||
{ name: "Consistency", weight: 40, scores: [3, 3, 4, 5, 4] },
|
||
{ name: "Governance", weight: 25, scores: [2, 2, 4, 5, 4] },
|
||
{ name: "Isolation", weight: 20, scores: [2, 2, 4, 5, 5] },
|
||
],
|
||
weights: [95, 70, 60, 50, 45, 40, 25, 20, 15, 10]
|
||
},
|
||
saas: {
|
||
title: "High-consolidation SaaS — ~200 tenants",
|
||
desc: "SaaS provider; per-tenant DB; cost efficiency + perception",
|
||
criteria: [
|
||
{ name: "Consolidation TCO", weight: 95, scores: [2, 5, 5, 2, 4] },
|
||
{ name: "Portability", weight: 60, scores: [5, 5, 4, 3, 3] },
|
||
{ name: "Isolation", weight: 55, scores: [2, 2, 4, 5, 5] },
|
||
{ name: "Governance", weight: 50, scores: [2, 2, 4, 5, 4] },
|
||
{ name: "Elasticity", weight: 40, scores: [5, 4, 4, 3, 4] },
|
||
{ name: "Fully managed", weight: 35, scores: [5, 5, 5, 4, 4] },
|
||
{ name: "Consistency", weight: 30, scores: [3, 3, 4, 5, 4] },
|
||
{ name: "List-cost fit", weight: 20, scores: [3, 3, 2, 1, 2] }
|
||
],
|
||
weights: [95, 80, 60, 55, 50, 40, 35, 30, 25, 20]
|
||
},
|
||
large: {
|
||
title: "Large workloads — ~10 DBs, >100 ECPUs",
|
||
desc: "Performance-intensive; high ECPU + storage per DB",
|
||
criteria: [
|
||
{ name: "Consistency", weight: 90, scores: [3, 3, 4, 5, 4] },
|
||
{ name: "Isolation", weight: 70, scores: [2, 2, 4, 5, 5] },
|
||
{ name: "Elasticity", weight: 55, scores: [5, 4, 4, 3, 4] },
|
||
{ name: "Governance", weight: 50, scores: [2, 2, 4, 5, 4] },
|
||
{ name: "Fully managed", weight: 40, scores: [5, 5, 5, 4, 4] },
|
||
{ name: "Consolidation TCO", weight: 35, scores: [2, 4, 4, 3, 4] },
|
||
{ name: "List-cost fit", weight: 30, scores: [3, 3, 2, 2, 2] },
|
||
{ name: "Portability", weight: 15, scores: [5, 5, 4, 3, 3] }
|
||
],
|
||
weights: [90, 80, 70, 55, 50, 40, 35, 30, 20, 15]
|
||
},
|
||
ultra: {
|
||
title: "SaaS Ultra Multi-Tenant — ~1,000 DBs",
|
||
desc: "Massive scale; per-DB minimums dominate cost; pool is essential",
|
||
criteria: [
|
||
{ name: "Consolidation TCO", weight: 100, scores: [1, 5, 5, 1, 4] },
|
||
{ name: "List-cost fit", weight: 70, scores: [1, 4, 3, 1, 2] },
|
||
{ name: "Elasticity", weight: 60, scores: [4, 5, 4, 2, 4] },
|
||
{ name: "Fully managed", weight: 50, scores: [5, 5, 5, 3, 4] },
|
||
{ name: "Portability", weight: 45, scores: [5, 5, 4, 2, 3] },
|
||
{ name: "Consistency", weight: 25, scores: [3, 3, 4, 5, 4] },
|
||
{ name: "Isolation", weight: 20, scores: [2, 2, 4, 5, 5] },
|
||
{ name: "Governance", weight: 15, scores: [2, 2, 4, 5, 4] },
|
||
],
|
||
weights: [100, 70, 60, 50, 45, 40, 25, 20, 15, 10]
|
||
},
|
||
crit_low: {
|
||
title: "Low Impact — Dev/test, PoC, sandbox",
|
||
desc: "Non-critical; minutes-to-hours RTO acceptable; cost is king",
|
||
criteria: [
|
||
{ name: "List-cost fit", weight: 100, scores: [5, 4, 2, 1, 2] },
|
||
{ name: "Fully managed", weight: 80, scores: [5, 5, 5, 3, 4] },
|
||
{ name: "Elasticity", weight: 60, scores: [5, 4, 3, 3, 3] },
|
||
{ name: "Portability", weight: 40, scores: [5, 5, 5, 3, 3] },
|
||
{ name: "Consolidation TCO", weight: 30, scores: [3, 5, 4, 2, 3] },
|
||
{ name: "Consistency", weight: 10, scores: [3, 3, 4, 5, 4] },
|
||
{ name: "Isolation", weight: 5, scores: [2, 2, 4, 5, 5] },
|
||
{ name: "Governance", weight: 5, scores: [2, 2, 3, 5, 4] },
|
||
],
|
||
weights: [100, 80, 60, 40, 30, 10, 5, 5, 5, 5]
|
||
},
|
||
crit_medium: {
|
||
title: "Medium Impact — Departmental apps, reporting",
|
||
desc: "Hours RTO; some compliance needs; balance cost vs. risk",
|
||
criteria: [
|
||
{ name: "Consistency", weight: 70, scores: [3, 3, 4, 5, 4] },
|
||
{ name: "Consolidation TCO", weight: 65, scores: [2, 5, 5, 3, 4] },
|
||
{ name: "Governance", weight: 55, scores: [2, 2, 4, 5, 4] },
|
||
{ name: "Isolation", weight: 50, scores: [2, 2, 4, 5, 5] },
|
||
{ name: "Fully managed", weight: 50, scores: [5, 5, 5, 4, 4] },
|
||
{ name: "List-cost fit", weight: 45, scores: [5, 4, 3, 2, 3] },
|
||
{ name: "Elasticity", weight: 40, scores: [5, 4, 4, 3, 4] },
|
||
{ name: "Portability", weight: 30, scores: [5, 5, 5, 3, 3] },
|
||
],
|
||
weights: [70, 65, 55, 50, 50, 45, 40, 35, 30, 20]
|
||
},
|
||
crit_high: {
|
||
title: "High Impact — Mission-critical (ERP, banking)",
|
||
desc: "Minutes RTO; strict SLAs; isolation + control dominate",
|
||
criteria: [
|
||
{ name: "Isolation", weight: 95, scores: [2, 2, 4, 5, 5] },
|
||
{ name: "Consistency", weight: 90, scores: [3, 3, 4, 5, 4] },
|
||
{ name: "Governance", weight: 85, scores: [2, 2, 4, 5, 4] },
|
||
{ name: "Fully managed", weight: 40, scores: [5, 5, 5, 4, 4] },
|
||
{ name: "Elasticity", weight: 30, scores: [5, 4, 4, 3, 4] },
|
||
{ name: "Consolidation TCO", weight: 20, scores: [2, 4, 4, 3, 4] },
|
||
{ name: "Portability", weight: 15, scores: [5, 5, 4, 3, 3] },
|
||
{ name: "List-cost fit", weight: 10, scores: [5, 4, 3, 1, 2] }
|
||
],
|
||
weights: [100, 95, 90, 85, 60, 40, 30, 20, 15, 10]
|
||
}
|
||
};
|
||
|
||
// Pre-populate origScores for reset
|
||
Object.keys(matrices).forEach(k => {
|
||
matrices[k].origWeights = [...matrices[k].weights];
|
||
matrices[k].criteria.forEach(c => { c.origScores = [...c.scores]; });
|
||
});
|
||
|
||
|
||
// ═══════════════════════════════════════════════════════════════════════════
|
||
// OVERVIEW CARDS — "When to Choose" tab (star ratings + descriptions)
|
||
// ═══════════════════════════════════════════════════════════════════════════
|
||
// stars: [Serverless, Elastic Pool, Ded.EP(Svl), ADB Dedicated, Ded.EP(Exa)]
|
||
// descs: same order
|
||
// ═══════════════════════════════════════════════════════════════════════════
|
||
|
||
const OVERVIEW_CARDS = [
|
||
{ title: "Cost Fit", icon: "💰", stars: [5, 4, 2, 2, 2],
|
||
descs: [
|
||
"Lowest cost floor: pure pay-per-use; auto-pause = $0 compute. Free tier for dev/test.",
|
||
"Pool shapes start at 128 ECPUs. Pay for pool — not per-DB provisioned. Up to 87% savings.",
|
||
"Pool min 256 ECPUs / 256 TB. Higher cost floor but consolidation offsets for large estates.",
|
||
"Highest cost floor: Exadata infra (DB + Storage servers) + ECPU compute. Justified by SLAs.",
|
||
"Exadata infra floor + pool shape min 128 ECPUs. Pool billing reduces compute vs standalone."
|
||
]
|
||
},
|
||
{ title: "Performance Consistency", icon: "⚡", stars: [3, 3, 4, 5, 4],
|
||
descs: [
|
||
"Good — shared platform may show slight variance under peak multi-tenant load.",
|
||
"Better than standalone: pool-level management. Still shared infrastructure.",
|
||
"High — dedicated tenancy reduces noisy-neighbor. Internal pool contention possible.",
|
||
"Highest — dedicated Exadata; strongest predictability for critical workloads.",
|
||
"High — Exadata predictability with pool resource sharing among your own DBs."
|
||
]
|
||
},
|
||
{ title: "Isolation", icon: "🔒", stars: [2, 2, 4, 5, 5],
|
||
descs: [
|
||
"OCI security standards with multi-tenant shared resources. Suitable for most workloads.",
|
||
"Same shared infra as Serverless. Pool is logical grouping, not physical isolation.",
|
||
"Dedicated single-tenant. Compute, storage, network isolated. LGPD/GDPR ready.",
|
||
"Strongest: customer-exclusive Exadata. No resource sharing with other customers.",
|
||
"Exadata-level isolation. Pool members co-located on same private infrastructure."
|
||
]
|
||
},
|
||
{ title: "Consolidation Efficiency", icon: "📦", stars: [2, 5, 5, 3, 4],
|
||
descs: [
|
||
"Weak — each DB billed independently. Costs scale linearly with DB count.",
|
||
"Best — pool absorbs per-DB mins. 1 ECPU/DB in pool vs 2 standalone. Massive savings at scale.",
|
||
"Excellent — compute + storage to leader. Single bill. Best for SaaS with 100s of DBs.",
|
||
"Moderate — compute per AVMC aggregate. Infra amortized but high floor.",
|
||
"Strong — pool billing on Exadata (up to 87% compute savings). Infra costs remain."
|
||
]
|
||
},
|
||
{ title: "Elasticity & Scaling", icon: "📈", stars: [5, 4, 4, 3, 4],
|
||
descs: [
|
||
"Excellent — auto-scale 3× base. Auto-pause/resume. Scale-to-zero. Instant provisioning.",
|
||
"Good — pool bursts to 4× shape. No per-DB auto-scaling. 1 ECPU minimum per member.",
|
||
"Good — pool bursts to 4× shape. Leader can scale both compute and storage shapes.",
|
||
"Manual — ECPU scaling per AVMC. No auto-scaling. Server additions require infra changes.",
|
||
"Good — pool bursts to 4× shape on Exadata. Better elasticity than standalone Dedicated."
|
||
]
|
||
},
|
||
{ title: "Operational Simplicity", icon: "🤖", stars: [5, 5, 4, 3, 3],
|
||
descs: [
|
||
"Zero admin: Oracle manages everything. Auto-patching on Oracle schedule.",
|
||
"Same zero admin + simple pool join/leave operations. Leader manages membership.",
|
||
"Mostly managed: custom patching windows available. Pause updates up to 4 weeks.",
|
||
"Fleet admin manages Exadata infra, AVMCs, ACDs. More operational responsibility.",
|
||
"Fleet admin manages Exadata; pool leader manages pool. Mix of infra + pool ops."
|
||
]
|
||
},
|
||
{ title: "Governance & Control", icon: "🏛️", stars: [2, 2, 4, 5, 4],
|
||
descs: [
|
||
"Limited — Oracle controls patching. No custom maintenance windows. Basic IAM.",
|
||
"Same as Serverless. Custom windows with 1024+ ECPUs pool shape.",
|
||
"Good — custom patching, pause updates. Dedicated maintenance scheduling.",
|
||
"Full — fleet admin controls all infra lifecycle, patching, and maintenance.",
|
||
"Strong — fleet admin + pool leader governance. Custom patching + pool control."
|
||
]
|
||
},
|
||
];
|
||
|
||
|
||
// ═══════════════════════════════════════════════════════════════════════════
|
||
// PRICING — OCI list prices (BYOL, Feb 2026)
|
||
// ═══════════════════════════════════════════════════════════════════════════
|
||
|
||
const PRICING = {
|
||
ecpuHr: 0.0807,
|
||
hrsMonth: 744,
|
||
storageGbMo: 0.1156,
|
||
backupGbMo: 0.0244,
|
||
objStorageGbMo: 0.0255,
|
||
x11mDbSrvHr: 2.8978,
|
||
x11mStSrvHr: 2.8978,
|
||
dbSrvEcpuCap: 760,
|
||
stSrvStorCap: 80,
|
||
poolMinEcpu: 256,
|
||
poolMinStorTB: 256,
|
||
minDbServers: 2,
|
||
minStServers: 3,
|
||
};
|
||
|
||
const COST_PRESETS = {
|
||
small: { dbs: 5, ecpuPerDb: 16, storPerDb: 5, usagePct: 100 },
|
||
consolidated: { dbs: 25, ecpuPerDb: 8, storPerDb: 2, usagePct: 100 },
|
||
saas: { dbs: 200, ecpuPerDb: 2, storPerDb: 1, usagePct: 100 },
|
||
large: { dbs: 10, ecpuPerDb: 64, storPerDb: 20, usagePct: 100 },
|
||
ultra: { dbs: 1000, ecpuPerDb: 2, storPerDb: 0.5, usagePct: 8 },
|
||
};
|
||
|
||
|
||
// ═══════════════════════════════════════════════════════════════════════════
|
||
// SCENARIO ANALYSIS — "Scenarios" tab tables
|
||
// ═══════════════════════════════════════════════════════════════════════════
|
||
// flavors: [Serverless, Elastic Pool, Ded.EP(Svl), ADB Dedicated, Ded.EP(Exa)]
|
||
// ═══════════════════════════════════════════════════════════════════════════
|
||
|
||
const SCENARIOS = [
|
||
{
|
||
title: "By Scale",
|
||
firstCol: "Scenario",
|
||
rows: [
|
||
{
|
||
label: "Small",
|
||
sub: "5 DBs; low steady usage",
|
||
flavors: [
|
||
"Best TCO and fastest time-to-value (no cost floor).",
|
||
"Viable if DBs are bursty and can share pool compute; but pool minimum shapes may over-provision.",
|
||
"Usually not economical due to pool minimums (256 ECPUs/256 TB).",
|
||
"Usually not economical unless strict regulatory/isolation requirements.",
|
||
"Over-engineered: Exadata infra + pool overhead not justified for small estates."
|
||
],
|
||
takeaway: "Choose Serverless when cost and agility dominate."
|
||
},
|
||
{
|
||
label: "Consolidated",
|
||
sub: "~25 medium DBs",
|
||
flavors: [
|
||
"Viable, but cost grows with aggregated consumption.",
|
||
"Sweet spot: pooling compute savings up to 87%; storage billed per-DB. Easy join/leave.",
|
||
"Best when you also want storage consolidated to the leader with dedicated tenancy.",
|
||
"Justify when risk/SLAs/compliance dominate beyond consolidation economics.",
|
||
"Good option if you need Exadata isolation + pool compute savings for 25+ DBs."
|
||
],
|
||
takeaway: "Elastic Pool for compute savings; Ded. Pool for full consolidation."
|
||
},
|
||
{
|
||
label: "High-consolidation SaaS",
|
||
sub: "~200 tenants / many DBs",
|
||
flavors: [
|
||
"Risk of linear cost growth and multi-tenant perception concerns.",
|
||
"Strong: pooled compute, per-tenant storage isolation, easy portability.",
|
||
"Best: dedicated tenancy + pooling + both compute & storage consolidated.",
|
||
"For premium/regulated tenants needing strongest isolation boundaries.",
|
||
"Strong: Exadata isolation + pool billing. Good for regulated SaaS at scale."
|
||
],
|
||
takeaway: "EP for mainstream; Ded. EP for tenancy; Dedicated/Ded.EP(Exa) for premium."
|
||
},
|
||
{
|
||
label: "Large workloads",
|
||
sub: "~10 DBs, >100 ECPUs + >100 TB",
|
||
flavors: [
|
||
"Viable; auto scaling up to 3\u00d7. Evaluate multi-tenant risk.",
|
||
"Good when multiple large workloads can share peak capacity.",
|
||
"Best when large workloads amortize pool floor; portability helps tuning.",
|
||
"Best for single large critical workload where predictability/isolation is top driver.",
|
||
"Good for multiple large workloads on Exadata needing pool compute efficiency."
|
||
],
|
||
takeaway: "1 large critical \u2192 Dedicated; several large \u2192 Pools."
|
||
},
|
||
{
|
||
label: "SaaS Ultra Multi-Tenant",
|
||
sub: "~1,000 DBs; 150 ECPU real usage",
|
||
flavors: [
|
||
"2 ECPU min/DB forces 2,000 ECPUs despite 150 real; cost explodes.",
|
||
"Best fit: pool absorbs 1,000 DBs with 1 ECPU min; bills on real aggregate peak. Massive savings.",
|
||
"Same compute savings + storage consolidation to leader. Requires min 256 ECPUs/256 TB.",
|
||
"2 ECPU min/DB + infrastructure floor = most expensive at this scale.",
|
||
"Pool on Exadata: 1 ECPU min/DB helps but infra floor remains. Better than standalone Dedicated."
|
||
],
|
||
takeaway: "Elastic Pools dominate when per-DB minimums exceed real usage."
|
||
}
|
||
]
|
||
},
|
||
{
|
||
title: "\uD83C\uDFAF By Business Criticality (Impact Level)",
|
||
firstCol: "Impact Level",
|
||
rows: [
|
||
{
|
||
label: "\uD83D\uDFE2 Low Impact",
|
||
sub: "Dev/test, sandbox, PoC, internal tools; minutes-to-hours RTO acceptable",
|
||
flavors: [
|
||
"Best fit: zero management, auto-pause saves cost, free tier for dev. Fast provisioning for PoCs.",
|
||
"Good if many dev DBs benefit from shared compute pool with 1 ECPU min.",
|
||
"Over-engineered for this tier. Pool minimums waste budget.",
|
||
"Over-engineered. Exadata infra floor unjustified for non-critical workloads.",
|
||
"Over-engineered. Exadata + pool overhead not justified for dev/test."
|
||
],
|
||
takeaway: "Serverless is the default for low-impact. Pool only if you have many dev DBs."
|
||
},
|
||
{
|
||
label: "\uD83D\uDFE1 Medium Impact",
|
||
sub: "Departmental apps, reporting, staging; hours RTO; some compliance needs",
|
||
flavors: [
|
||
"Viable for most medium-impact workloads with auto-scaling up to 3\u00d7.",
|
||
"Strong: pooled compute handles burst demand; per-DB storage isolation aligns with department boundaries.",
|
||
"Best when compliance or data sovereignty requires dedicated tenancy + you have 25+ DBs to amortize floor.",
|
||
"Justified if specific regulatory requirements (LGPD/GDPR) mandate Exadata-level isolation.",
|
||
"Good if compliance requires Exadata + you want pool billing for cost efficiency."
|
||
],
|
||
takeaway: "Elastic Pool is the sweet spot. Ded. Pool or Dedicated only if compliance forces it."
|
||
},
|
||
{
|
||
label: "\uD83D\uDD34 High Impact",
|
||
sub: "Mission-critical: ERP, core banking, e-commerce, telecom; minutes RTO; strict SLAs",
|
||
flavors: [
|
||
"Risky: shared multi-tenant adds performance variance. No custom patching control. Not recommended.",
|
||
"Acceptable only with careful pool capacity planning. No tenancy-level isolation from other OCI customers.",
|
||
"Strong: dedicated tenancy eliminates noisy-neighbor. Custom patching windows. Pause updates up to 4 weeks.",
|
||
"Gold standard: dedicated Exadata, maximum isolation, predictability, and control for mission-critical SLAs.",
|
||
"Excellent: Exadata isolation + pool compute savings. Best of both worlds for mission-critical fleets."
|
||
],
|
||
takeaway: "Dedicated or Ded. Pool for mission-critical. Ded.EP(Exa) for fleets."
|
||
}
|
||
]
|
||
}
|
||
];
|
||
|
||
|
||
// ═══════════════════════════════════════════════════════════════════════════
|
||
// FEATURE MATRIX — capabilities by flavor and DB version
|
||
// ═══════════════════════════════════════════════════════════════════════════
|
||
//
|
||
// availability per flavor:
|
||
// [Serverless, Elastic Pool, Ded.EP(Svl), ADB Dedicated, EP(Dedicated)]
|
||
//
|
||
// version: "any" (19c+26ai), "26ai" (26ai only), "19c" (19c only)
|
||
//
|
||
// category: "AI & Vectors", "HA & DR", "Security", "Performance",
|
||
// "Management", "Developer", "Data Integration"
|
||
//
|
||
// When a user checks a feature as "required", flavors that don't support it
|
||
// get visually disabled in the Decision Matrix and Cost Estimator.
|
||
//
|
||
// ═══════════════════════════════════════════════════════════════════════════
|
||
|
||
const FEATURES = [
|
||
// ═══════════════════════════════════════════════════════════════════════════
|
||
// Features shown here have at least ONE meaningful difference:
|
||
// • Across flavors (available on some but not all), OR
|
||
// • Across versions (26ai-only, not available on 19c)
|
||
//
|
||
// Universal features available on ALL flavors AND BOTH versions are excluded:
|
||
// Database Vault, Data Safe, APEX, Refreshable Clones, Auto-Indexing,
|
||
// Autonomous Data Guard (Local + Cross-Region), Application Continuity,
|
||
// Private Endpoints, Customer-Managed Encryption Keys, GoldenGate,
|
||
// Data Transforms (ETL), Real-Time SQL Plan Management, Spatial, JSON.
|
||
// ═══════════════════════════════════════════════════════════════════════════
|
||
//
|
||
// avail: [Serverless, Elastic Pool, Ded.EP(Svl), ADB Dedicated, EP(Dedicated)]
|
||
// version: "both" (19c & 26ai), "26ai" (26ai only)
|
||
//
|
||
|
||
// ── AI & Vectors (26ai only — not available on 19c) ──
|
||
{ name: "AI Vector Search", category: "AI & Vectors", version: "26ai", avail: [true, true, true, true, true], doc: "https://docs.oracle.com/en/database/oracle/oracle-database/26/vecse/" },
|
||
{ name: "Select AI (Natural Language SQL)", category: "AI & Vectors", version: "26ai", avail: [true, true, true, true, true], doc: "https://docs.oracle.com/en-us/iaas/autonomous-database-serverless/doc/sql-generation-ai-autonomous-database.html" },
|
||
{ name: "Select AI Agent (Agentic AI)", category: "AI & Vectors", version: "26ai", avail: [true, true, true, true, true], doc: "https://docs.oracle.com/en-us/iaas/autonomous-database-serverless/doc/select-ai-agent.html" },
|
||
{ name: "Built-in MCP Server", category: "AI & Vectors", version: "both", avail: [true, true, true, false, false], doc: "https://docs.oracle.com/en-us/iaas/releasenotes/autonomous-database-serverless/2025-12-mcp-server-for-autonomous-ai-database.htm" },
|
||
{ name: "Data Lake Accelerator", category: "AI & Vectors", version: "26ai", avail: [true, true, true, false, false], doc: "https://docs.oracle.com/en-us/iaas/autonomous-database-serverless/doc/data-lake-accelerator.html" },
|
||
|
||
// ── Developer (26ai only — not available on 19c) ──
|
||
{ name: "JSON Relational Duality Views", category: "Developer", version: "26ai", avail: [true, true, true, true, true], doc: "https://docs.oracle.com/en/database/oracle/oracle-database/26/jsnvu/index.html" },
|
||
{ name: "SQL/PGQ Property Graph Queries", category: "Developer", version: "26ai", avail: [true, true, true, true, true], doc: "https://docs.oracle.com/en/database/oracle/property-graph/25.3/spgdg/sql-property-graphs.html" },
|
||
{ name: "JavaScript in DB (MLE)", category: "Developer", version: "26ai", avail: [true, true, true, true, true], doc: "https://docs.oracle.com/en/database/oracle/oracle-database/26/mlejs/" },
|
||
{ name: "Lock-Free Reservations", category: "Developer", version: "26ai", avail: [true, true, true, true, true], doc: "https://docs.oracle.com/en/database/oracle/oracle-database/26/adfns/using-lock-free-reservation.html" },
|
||
{ name: "Kafka APIs for TxEventQ", category: "Developer", version: "26ai", avail: [true, true, true, true, true], doc: "https://docs.oracle.com/en/database/oracle/oracle-database/26/adque/" },
|
||
{ name: "Boolean Data Type in SQL", category: "Developer", version: "26ai", avail: [true, true, true, true, true], doc: "https://docs.oracle.com/en/database/oracle/oracle-database/26/sqlrf/Data-Types.html" },
|
||
|
||
// ── Data Integration (26ai only — not available on 19c) ──
|
||
{ name: "Cloud Links (Data Sharing)", category: "Data Integration", version: "26ai", avail: [true, true, true, false, false], doc: "https://docs.oracle.com/en-us/iaas/autonomous-database-serverless/doc/cloud-links.html" },
|
||
{ name: "External Table Cache", category: "Data Integration", version: "26ai", avail: [true, true, true, false, false], doc: "https://docs.oracle.com/en-us/iaas/autonomous-database-serverless/doc/external-table-cache.html" },
|
||
{ name: "Apache Iceberg Support", category: "Data Integration", version: "both", avail: [true, true, true, true, true], doc: "https://docs.oracle.com/en-us/iaas/autonomous-database-serverless/doc/autonomous-iceberg.html" },
|
||
|
||
// ── HA & DR (both versions, flavor differences) ──
|
||
{ name: "Active Data Guard (Read-Only Standby)", category: "HA & DR", version: "both", avail: [false, false, false, true, true], doc: "https://www.oracle.com/database/data-guard/" },
|
||
{ name: "Multi-Cloud DR", category: "HA & DR", version: "both", avail: [false, false, false, true, true], doc: "https://docs.oracle.com/en/cloud/paas/autonomous-database/dedicated/adbau/" },
|
||
{ name: "Custom Patching Schedule", category: "HA & DR", version: "both", avail: [false, false, true, true, true], doc: "https://docs.oracle.com/en/cloud/paas/autonomous-database/dedicated/adbdp/" },
|
||
{ name: "Pause Patching (up to 4 weeks)", category: "HA & DR", version: "both", avail: [false, false, true, true, true], doc: "https://docs.oracle.com/en/cloud/paas/autonomous-database/dedicated/adbdp/" },
|
||
|
||
// ── Security (both versions, flavor differences) ──
|
||
{ name: "DB Vault Operations Control", category: "Security", version: "both", avail: [false, false, false, true, true], doc: "https://docs.oracle.com/en/cloud/paas/autonomous-database/dedicated/adbdv/" },
|
||
{ name: "Dedicated Exadata Isolation", category: "Security", version: "both", avail: [false, false, true, true, true], doc: "https://docs.oracle.com/en/cloud/paas/autonomous-database/dedicated/adbd-index.html" },
|
||
|
||
// ── Performance (both versions, flavor differences) ──
|
||
{ name: "Compute Auto-Scaling (3×)", category: "Performance", version: "both", avail: [true, false, false, true, false], doc: "https://docs.oracle.com/en/cloud/paas/autonomous-database/serverless/adbsb/autonomous-auto-scale.html" },
|
||
{ name: "Elastic Pool Burst (up to 4×)", category: "Performance", version: "both", avail: [false, true, true, false, true], doc: "https://docs.oracle.com/en-us/iaas/autonomous-database-serverless/doc/elastic-pools-create-manage.html" },
|
||
|
||
// ── Operational (both versions, flavor differences) ──
|
||
{ name: "Elastic Pool (Compute Billing)", category: "Operational", version: "both", avail: [false, true, true, false, true], doc: "https://docs.oracle.com/en-us/iaas/autonomous-database-serverless/doc/elastic-pools-create-manage.html" },
|
||
{ name: "Fleet Admin (Infra Control)", category: "Operational", version: "both", avail: [false, false, false, true, true], doc: "https://docs.oracle.com/en/cloud/paas/autonomous-database/dedicated/fleet-admin.html" },
|
||
{ name: "Scale-to-Zero / Auto-Pause", category: "Operational", version: "both", avail: [true, false, false, false, false], doc: "https://docs.oracle.com/en-us/iaas/autonomous-database-serverless/doc/autonomous-auto-pause.html" },
|
||
{ name: "Developer Database (Free Tier)", category: "Operational", version: "both", avail: [true, false, false, false, false], doc: "https://docs.oracle.com/en-us/iaas/autonomous-database-serverless/doc/autonomous-always-free.html" },
|
||
];
|
||
|
||
// ═══════════════════════════════════════════════════════════════════════════
|
||
// CLOUD PLATFORM AVAILABILITY — where each flavor can run
|
||
// ═══════════════════════════════════════════════════════════════════════════
|
||
// avail: [Serverless, Elastic Pool, Ded.EP(Svl), ADB Dedicated, EP(Dedicated)]
|
||
//
|
||
// Sources:
|
||
// - Serverless: OCI native + Oracle Database@Azure (ADB Serverless on Azure) + Database@Google Cloud
|
||
// - Dedicated: OCI + Database@AWS + Database@Azure + Database@Google Cloud
|
||
// - Elastic Pool flavors inherit from their parent deployment model
|
||
//
|
||
const CLOUD_PLATFORMS = [
|
||
{ name: "OCI", icon: "☁️", avail: [true, true, true, true, true], doc: "" },
|
||
{ name: "AWS", icon: "🟠", avail: [false, false, false, true, true], doc: "https://docs.oracle.com/en-us/iaas/Content/database-at-aws/oaaws-regions.htm" },
|
||
{ name: "Azure", icon: "🔵", avail: [true, true, true, true, true], doc: "https://docs.oracle.com/en-us/iaas/Content/multicloud/regions.htm" },
|
||
{ name: "Google Cloud", icon: "🟢", avail: [true, true, true, true, true], doc: "https://docs.oracle.com/en-us/iaas/Content/multicloud/regions.htm" },
|
||
];
|