Keep one product record

Store name, canonical URL, platform model and core facts once. Use join tables for categories, capabilities and comparison membership.

Relationship example

CREATE TABLE comparison_members (
  comparison_id bigint NOT NULL,
  product_id bigint NOT NULL,
  sort_order smallint NOT NULL,
  PRIMARY KEY (comparison_id, product_id)
);

Add foreign keys and indexes appropriate to your engine and schema.

Separate facts from opinions

Product version and supported deployment are structured facts. The choice rationale is editorial content that should explicitly state its use case and assumptions.

Provenance

Store the official source, last manual verification date and reviewer state for volatile features and prices. Prefer clearly unknown fields over fabricated values.

Publishing rule

A machine-suggested update must not silently rewrite the public listing or comparisons before validation.

Editorial note

Examples are starting points, not production security audits. Confirm dependencies, versions and pricing using linked vendor documentation.