Designing a Jedox solution that lasts: small cubes, clean splits, real discovery
· Jedox
Your cube design is also your security model, your performance profile and your upgrade path. How I design Jedox systems that survive - smaller purpose-built cubes, input split from output, and a discovery phase that pays off.
I have never seen a team regret having one cube too many. The one cube that tries to do everything causes regrets every time.
I have written before about the Jedox Design System - the report and UI side of building things that look and feel right. This post is about the layer underneath: how to design the system itself. The cubes, the dimensions, the rules, the loads. Because your cube design is not just a modelling choice - it is also your security model, your performance profile and your upgrade path. Most teams find this out a year or more into production. The goal of this post is that you find it out earlier.
Discovery is the design phase in disguise
Before a single cube exists, the most important work of the whole project happens: understanding the client. On this I do not compromise: discovery is where the expensive decisions get made, not a warm-up. In Jedox, the costly choices are structural: which dimensions exist, at what grain, in which cubes. Once a Version or CostCenter dimension is wired into cubes, rules, Integrator loads and fifty reports, changing it is a re-implementation, not a tweak. Discovery is the only moment those decisions are still cheap.
What a real discovery looks like:
- Interview the people who do the work, not just the sponsor. The CFO tells you what the process should be; the controller who runs it in Excel tells you what it actually is. Ask "show me", not "tell me" - the real process lives in the operator's files, and every spreadsheet they open during a close is a hidden requirement.
- Design backwards from reports and decisions. Catalogue the reports and the decisions they support, derive the dimensionality each one needs, and only then ask what inputs feed it. Every dimension must earn its place in a named report or a named decision. Teams that design forwards ("load everything from the ERP, then figure out reporting") build transaction-grain cubes nobody can plan on.
- Profile the real data. Clients describe their data as they wish it were. Get real extracts and check element counts, key stability, null rates, and whether the GL-to-planning-account mapping actually exists or lives in someone's head. Half of the "Jedox problems" raised in UAT are data problems that profiling would have caught in week one.
- Workshop around artefacts, not conversations. People cannot specify a model from a blank page, but they are excellent at telling you why your strawman is wrong. Bring a draft dimension model to the second workshop and let them attack it.
Discovery is done when four artefacts exist and are signed: process maps as they will run in the new world, the dimension model on paper, a ranked report catalogue, and a data contract per source with a named owner. Skipping this does not save time - it relocates the cost to UAT with a 10x markup.
More smaller cubes beat one big cube
The single biggest design decision, and the one people get wrong most confidently: how much goes in one cube. The monster cube fails on four fronts at once.
- Performance. Every dimension you bolt on multiplies the theoretical cell space and dilutes sparsity. Jedox's own tech specs say a cube technically supports 250 dimensions and the documentation caps its own recommendation at 30 - treat both numbers as theoretical. In all my years of building these systems I have never seen a healthy cube anywhere near 30 dimensions. My suggestion is to keep it smaller, and if it needs to be a big cube, I suggest strongly thinking about it if it reaches past 12, in any case - and if it is a truly big cube, it shall better be an output cube where data is not rule calculated and is "dead" - and in practice most planning cubes are healthiest with five to ten. Already past ten, every report needs a wall of selectors and every load needs default-element padding.
- Rules. In one big cube, every rule fires against the whole cube's cell space, so unrelated logic - HR drivers, sales price times volume, P&L consolidation - collides in one rule stack, and every rule needs guards against every other.
- Security. Access rights are easy to reason about when sales sees the Sales cube and HR sees the Personnel cube. They are a permanent workaround factory when everything is element-level carve-outs inside one cube.
- Maintainability. A small cube can be rebuilt, re-dimensioned or archived without freezing the whole model.
Look at how Jedox itself builds: the prebuilt models (Integrated Financial Planning, Cost Center, Profit Center) are federations of small cubes feeding a P&L cube. Copy that shape.
My design test: write one sentence stating what business question the cube answers and who writes to it. If the sentence needs "and" twice, split the cube. And if a dimension sits on "~" for most of a measure group, that measure group belongs somewhere else.
Split input from output
Input cubes are for entering data, reporting cubes are for reading it, and an Integrator job moves the data between them.
Raw input cubes (planner entry, actuals at load grain) and reporting cubes have opposite requirements. Input wants writeback, splashing, cell locking and fine-grained security. Reporting wants dense precalculated aggregates, heavy logic frozen into stored values, and read-mostly caching. Mix them and every writeback invalidates the calculation cache for every reader, and month-end grinds while two hundred planners splash against the same cube the board pack reads from.
The pattern that works is a chain: source extract, then a staging cube at source grain (no rules, no user access), then an input cube at planning grain, then a reporting cube with precalculated results. Each hop is one Integrator job with a rowcount reconciliation, and every job is rerunnable without double-counting (use Update or Insert mode - a rerun on Add mode silently doubles your actuals, and nobody notices until reconciliation).
One real cost: the split introduces latency. Users can see stale reporting data between syncs, so write the refresh contract down - "staging to reporting runs on save, max 60 seconds lag" - or users will silently make decisions on old numbers.
Dimensions: fewer, shared, and deliberately chosen
- Attributes for description, dimensions for planning grain. Make something a dimension only if data is entered or planned at that grain, or security must be set on it. Product colour, account type, manager name - those are attributes. Jedox's virtual dimensions let you pivot and filter on string attributes as if they were dimensions, so you get the slicing without paying the cell-space cost.
- Conform your shared dimensions. Cost Center in the HR cube must be the same dimension object as Cost Center in the Opex cube, not a lookalike copy. Near-duplicate dimensions maintained by two different jobs are the number one cause of cross-cube rule misses and reports that never reconcile. One shared dimension, one owner, one load job.
- Version design. One conformed Version dimension everywhere, entered versions flat (Actual, Budget, Forecast 3+9), never consolidated under a parent - an "Actual + Budget" sum is meaningless. Variances are calculated elements or report logic, never stored input.
A dimension is a maintenance commitment for the life of the model. An attribute can be changed at any time.
Rules light, batch heavy
Jedox rules calculate on read. That is wonderful for sparse cell-level maths - price times quantity, KPI ratios, version blending, a lookup of three driver values - and a serious performance problem for anything dense. The rule engine documentation is refreshingly honest: the fallback engine at 10-100 microseconds per cell means a 10-billion-cell area "could take 10 days".
So my default is boring and firm: does this number need to change the instant a user types? If no, it belongs in an Integrator job, not in a rule. Currency-translated actuals, allocations, materialised aggregations - precalculate them into stored values overnight. The fastest rule is the one you precalculated last night. (I have written more on this in rules versus stored values and writing efficient rules.)
Two patterns worth stealing from Jedox's own models:
- Allocations live in configuration cubes, not rule stacks. The Profit Center model uses an allocation configuration cube - source filters, keys, rates and targets as data - feeding a batch job that writes stored, auditable results. Power users maintain the definitions through a form; nobody touches rule text.
- A settings cube on day one. A tiny lookup cube holding FX rates, inflation assumptions, the current forecast version pointer, the blend month. Route every constant a business owner might ever want to change through it. If a number a business owner might change lives anywhere but a lookup cube, you have hired yourself as its permanent maintainer.
Design for the reorganisation that is coming
The business will reorganise, usually about 18 months in. Whether that is a Tuesday or a project depends on decisions you make now:
- Store data only at base level, keyed on stable source-system codes. Base elements are forever; hierarchies are disposable views over them. Adding an "Org 2027" alternate hierarchy next to "Org 2026" then re-aggregates all history under the new structure with zero data migration.
- Never encode structure in names or rules. Every rule that names a specific org element, and every report with hardcoded element names, is a future breakage.
- Run the reorg drill before go-live. Simulate merging two cost centres and adding a region. Passing score: one Integrator dimension update, zero rule edits, zero report edits, zero data reloads.
The quiet design features
Three things that rarely make it into design documents and always make it into year-two regrets:
- Naming conventions are an API contract. Every load, rule, subset and report references objects by literal name, so a rename in year two is a breaking change across the stack. Fix prefixes (staging vs input vs reporting cubes), casing and language policy before the first cube exists - and nothing enters production named "Test", "Copy of" or "New". Every temporary cube celebrates its fifth birthday in production.
- Security is an input to dimension design. Jedox grants rights on elements and subtrees, so "sales managers see only their region" is decided the day you design the entity dimension. If legal structure and management responsibility are blended into one hierarchy, clean access control is permanently impossible. For every dimension, ask: will anyone's access rights ever be defined along this axis?
- Test at production volume. Every model is fast with 30 cost centres and 3 users. Load full-size dimensions and run a scripted close-week concurrency test before design sign-off, because the fixes (splitting cubes, raising grain, moving rules to batch) are design changes, not tuning.
The design rules, in short
Run a discovery that ends in signed artefacts. Build several small, single-purpose cubes that share conformed dimensions. Split input from reporting with an explicit refresh contract. Keep rules for what must react instantly and batch everything else. Externalise every assumption into settings cubes. Store at base level so hierarchies stay disposable. And choose names carefully, because in practice they are permanent.
Design like this and the system bends when the business changes instead of breaking. It also sets up the next decision every project faces, whether to adopt standard content or build custom. I cover that in a separate post.