{
  "format": "dataset-manifest/1",
  "slug": "product-catalogue",
  "version": 1,
  "seed": "product-catalogue:1",
  "spec": {
    "format": "dataset/1",
    "slug": "product-catalogue",
    "name": "Product Catalogue",
    "tagline": "A reference catalogue for a hardware store with departments, categories, products, and suppliers.",
    "description": "Hardware stores rely on organized product information to manage inventory and assist customers. This dataset models a reference catalogue that includes departments, categories, products, and suppliers. The tables provide a structured way to store and retrieve details about each product, the categories they belong to, and the suppliers that provide them. By utilizing this synthetic dataset, developers can practice querying relational data and understand how to effectively manage product information in an e-commerce context. The relationships between tables allow for rich queries, such as finding all products under a specific category or identifying suppliers for a particular product. This dataset is ideal for API mocking and teaching purposes, allowing learners to explore data handling in a controlled environment.",
    "domain": "ecommerce",
    "shape": "lookup-catalog",
    "useCases": [
      "api-mocking",
      "teaching"
    ],
    "keywords": [
      "hardware",
      "products",
      "categories",
      "suppliers",
      "inventory",
      "ecommerce"
    ],
    "locale": "en",
    "license": "CC0-1.0",
    "version": 1,
    "tables": {
      "departments": {
        "description": "Each row represents a department within the hardware store, linking to multiple categories associated with it.",
        "rows": 10,
        "columns": {
          "id": {
            "kind": "pk",
            "description": "Unique identifier for the department."
          },
          "name": {
            "kind": "words",
            "min": 2,
            "max": 50,
            "description": "The name of the department."
          },
          "description": {
            "kind": "sentence",
            "max": 200,
            "nullable": true,
            "description": "A brief description of the department."
          }
        }
      },
      "categories": {
        "description": "This table holds the categories of products, each linked to a department.",
        "rows": 30,
        "columns": {
          "id": {
            "kind": "pk",
            "description": "Unique identifier for the category."
          },
          "department_id": {
            "kind": "fk",
            "ref": "departments.id",
            "description": "Identifier for the department that this category belongs to."
          },
          "name": {
            "kind": "words",
            "min": 2,
            "max": 50,
            "description": "The name of the category."
          },
          "description": {
            "kind": "sentence",
            "max": 200,
            "nullable": true,
            "description": "A brief description of the category."
          }
        }
      },
      "products": {
        "description": "Each row represents a product, linked to its category and supplier, with attributes such as price and stock.",
        "rows": 100,
        "columns": {
          "id": {
            "kind": "pk",
            "description": "Unique identifier for the product."
          },
          "category_id": {
            "kind": "fk",
            "ref": "categories.id",
            "description": "Identifier for the category that this product belongs to."
          },
          "supplier_id": {
            "kind": "fk",
            "ref": "suppliers.id",
            "description": "Identifier for the supplier of this product."
          },
          "name": {
            "kind": "words",
            "min": 2,
            "max": 100,
            "description": "The name of the product."
          },
          "price": {
            "kind": "decimal",
            "min": 1,
            "max": 1000,
            "scale": 2,
            "description": "The price of the product."
          },
          "stock_quantity": {
            "kind": "int",
            "min": 0,
            "max": 1000,
            "description": "The available stock quantity for the product."
          }
        }
      },
      "suppliers": {
        "description": "This table contains information about suppliers, which provide products to the store.",
        "rows": 20,
        "columns": {
          "id": {
            "kind": "pk",
            "description": "Unique identifier for the supplier."
          },
          "name": {
            "kind": "words",
            "min": 2,
            "max": 100,
            "description": "The name of the supplier."
          },
          "contact_email": {
            "kind": "email",
            "from": "name",
            "description": "Email contact for the supplier."
          },
          "phone": {
            "kind": "phone",
            "description": "Phone number for the supplier."
          }
        }
      }
    },
    "structure": "multi-table",
    "traits": [
      "categorical",
      "nullable",
      "high-cardinality"
    ],
    "analysisQuestions": [
      "What are the most stocked products in each category?",
      "Which suppliers provide the highest number of products?",
      "How does the average product price vary by department?",
      "Are there any categories with no products listed?",
      "What departments have the most diverse product offerings?"
    ],
    "suggestedQueries": [
      {
        "title": "Join Products and Categories",
        "sql": "SELECT products.name, categories.name FROM products JOIN categories ON products.category_id = categories.id;",
        "dialect": "postgres"
      },
      {
        "title": "Count Products by Category",
        "sql": "SELECT categories.name, COUNT(products.id) FROM categories LEFT JOIN products ON categories.id = products.category_id GROUP BY categories.name;",
        "dialect": "postgres"
      },
      {
        "title": "Average Price by Department",
        "sql": "SELECT departments.name, AVG(products.price) FROM products JOIN categories ON products.category_id = categories.id JOIN departments ON categories.department_id = departments.id GROUP BY departments.name;",
        "dialect": "postgres"
      },
      {
        "title": "Suppliers and Product Count",
        "sql": "SELECT suppliers.name, COUNT(products.id) FROM suppliers LEFT JOIN products ON suppliers.id = products.supplier_id GROUP BY suppliers.name;",
        "dialect": "postgres"
      }
    ],
    "usageScenarios": [
      {
        "title": "Inventory Management System",
        "body": "Developers creating an inventory management system can use this dataset to simulate product storage, retrieval, and categorization. They can build APIs that handle product listings and filter them by category, department, or supplier."
      },
      {
        "title": "E-commerce Platform Development",
        "body": "E-commerce platform developers can utilize this dataset to practice integrating product information into their applications. They can create mock APIs that return product details, prices, and supplier information, as well as simulate user interactions with products."
      },
      {
        "title": "Teaching Database Concepts",
        "body": "Educators can use this dataset in classroom settings to teach students about relational databases and SQL querying. Students can engage with real-world examples of how products are categorized and managed in a hardware store environment."
      },
      {
        "title": "Data Analysis Projects",
        "body": "Data analysts can leverage this dataset to perform various analyses, such as identifying trends in product pricing, stock levels, and supplier performance. This dataset provides a rich source of information for practicing data visualization and reporting skills."
      }
    ]
  },
  "counts": {
    "departments": 10,
    "categories": 30,
    "suppliers": 20,
    "products": 100
  },
  "stats": {
    "departments": {
      "rows": 10,
      "columns": {
        "id": {
          "nulls": 0,
          "distinct": 10,
          "min": 1,
          "max": 10
        },
        "name": {
          "nulls": 0,
          "distinct": 10
        },
        "description": {
          "nulls": 1,
          "distinct": 9
        }
      }
    },
    "categories": {
      "rows": 30,
      "columns": {
        "id": {
          "nulls": 0,
          "distinct": 30,
          "min": 1,
          "max": 30
        },
        "department_id": {
          "nulls": 0,
          "distinct": 9,
          "min": 2,
          "max": 10
        },
        "name": {
          "nulls": 0,
          "distinct": 30
        },
        "description": {
          "nulls": 0,
          "distinct": 30
        }
      }
    },
    "products": {
      "rows": 100,
      "columns": {
        "id": {
          "nulls": 0,
          "distinct": 100,
          "min": 1,
          "max": 100
        },
        "category_id": {
          "nulls": 0,
          "distinct": 30,
          "min": 1,
          "max": 30
        },
        "supplier_id": {
          "nulls": 0,
          "distinct": 20,
          "min": 1,
          "max": 20
        },
        "name": {
          "nulls": 0,
          "distinct": 100
        },
        "price": {
          "nulls": 0,
          "distinct": 100,
          "min": 22.25,
          "max": 997.07
        },
        "stock_quantity": {
          "nulls": 0,
          "distinct": 95,
          "min": 10,
          "max": 956
        }
      }
    },
    "suppliers": {
      "rows": 20,
      "columns": {
        "id": {
          "nulls": 0,
          "distinct": 20,
          "min": 1,
          "max": 20
        },
        "name": {
          "nulls": 0,
          "distinct": 20
        },
        "contact_email": {
          "nulls": 0,
          "distinct": 20
        },
        "phone": {
          "nulls": 0,
          "distinct": 20
        }
      }
    }
  },
  "artifacts": [
    {
      "file": "csv/departments.csv",
      "format": "csv",
      "table": "departments",
      "key": "datasets/product-catalogue/v1/csv/departments.csv",
      "url": "https://database-sample-website.s3.eu-north-1.amazonaws.com/datasets/product-catalogue/v1/csv/departments.csv",
      "bytes": 2509,
      "sha256": "add9cb062319d684244e49bae4a7e8b6d9c92d7cd34c9669dfe4b6312356578f",
      "rows": 10,
      "contentType": "text/csv; charset=utf-8"
    },
    {
      "file": "csv/categories.csv",
      "format": "csv",
      "table": "categories",
      "key": "datasets/product-catalogue/v1/csv/categories.csv",
      "url": "https://database-sample-website.s3.eu-north-1.amazonaws.com/datasets/product-catalogue/v1/csv/categories.csv",
      "bytes": 6664,
      "sha256": "c719f60790e2d88c933eb77f3dd36fad1bb3be29b95b181b4295af6536bcf315",
      "rows": 30,
      "contentType": "text/csv; charset=utf-8"
    },
    {
      "file": "csv/suppliers.csv",
      "format": "csv",
      "table": "suppliers",
      "key": "datasets/product-catalogue/v1/csv/suppliers.csv",
      "url": "https://database-sample-website.s3.eu-north-1.amazonaws.com/datasets/product-catalogue/v1/csv/suppliers.csv",
      "bytes": 14585,
      "sha256": "04be1725efa053dc2e1c49e6f9ace1db5e3f3edeedb7ceb8755f94c236c172be",
      "rows": 20,
      "contentType": "text/csv; charset=utf-8"
    },
    {
      "file": "csv/products.csv",
      "format": "csv",
      "table": "products",
      "key": "datasets/product-catalogue/v1/csv/products.csv",
      "url": "https://database-sample-website.s3.eu-north-1.amazonaws.com/datasets/product-catalogue/v1/csv/products.csv",
      "bytes": 35694,
      "sha256": "9fba8ab1c2e507c5c45fffb023c0acb65678e13c74ba9204ade1d2bbc8448f57",
      "rows": 100,
      "contentType": "text/csv; charset=utf-8"
    },
    {
      "file": "product-catalogue.json",
      "format": "json",
      "table": null,
      "key": "datasets/product-catalogue/v1/product-catalogue.json",
      "url": "https://database-sample-website.s3.eu-north-1.amazonaws.com/datasets/product-catalogue/v1/product-catalogue.json",
      "bytes": 77000,
      "sha256": "4665cb3b442ffdbf2df307606d6d68a552b6b910cd1a24cbc0245543547e5abe",
      "rows": null,
      "contentType": "application/json; charset=utf-8"
    },
    {
      "file": "sql/postgres.sql",
      "format": "sql-postgres",
      "table": null,
      "key": "datasets/product-catalogue/v1/sql/postgres.sql",
      "url": "https://database-sample-website.s3.eu-north-1.amazonaws.com/datasets/product-catalogue/v1/sql/postgres.sql",
      "bytes": 63594,
      "sha256": "a9a9afc488730aaa4d89781b9ac33984aa16face54ba4348c63195a2a96fe2e0",
      "rows": null,
      "contentType": "application/sql; charset=utf-8"
    },
    {
      "file": "sql/mysql.sql",
      "format": "sql-mysql",
      "table": null,
      "key": "datasets/product-catalogue/v1/sql/mysql.sql",
      "url": "https://database-sample-website.s3.eu-north-1.amazonaws.com/datasets/product-catalogue/v1/sql/mysql.sql",
      "bytes": 63143,
      "sha256": "ff4d33d7a72bdfab5ebbb4f3ca527ce98bd3594999af15a2252ab623e8c579b4",
      "rows": null,
      "contentType": "application/sql; charset=utf-8"
    },
    {
      "file": "sql/mssql.sql",
      "format": "sql-mssql",
      "table": null,
      "key": "datasets/product-catalogue/v1/sql/mssql.sql",
      "url": "https://database-sample-website.s3.eu-north-1.amazonaws.com/datasets/product-catalogue/v1/sql/mssql.sql",
      "bytes": 63662,
      "sha256": "28d3f58ecb80736c33aaa981fdda6ca912b34d15eac60ae910b2fd12ad78023e",
      "rows": null,
      "contentType": "application/sql; charset=utf-8"
    },
    {
      "file": "sql/sqlite.sql",
      "format": "sql-sqlite",
      "table": null,
      "key": "datasets/product-catalogue/v1/sql/sqlite.sql",
      "url": "https://database-sample-website.s3.eu-north-1.amazonaws.com/datasets/product-catalogue/v1/sql/sqlite.sql",
      "bytes": 62978,
      "sha256": "59160f1d7aed9da16c59762ecf557d1a94f938e8f5554867be8338d9bcf219e1",
      "rows": null,
      "contentType": "application/sql; charset=utf-8"
    },
    {
      "file": "prisma/seed.ts",
      "format": "prisma-seed",
      "table": null,
      "key": "datasets/product-catalogue/v1/prisma/seed.ts",
      "url": "https://database-sample-website.s3.eu-north-1.amazonaws.com/datasets/product-catalogue/v1/prisma/seed.ts",
      "bytes": 72072,
      "sha256": "f5cb4f7d8575218bb9fd6d6ae3351c20436ffa8e2e2af100373008dfcbd4695b",
      "rows": null,
      "contentType": "application/typescript; charset=utf-8"
    },
    {
      "file": "django/fixtures.json",
      "format": "django-fixture",
      "table": null,
      "key": "datasets/product-catalogue/v1/django/fixtures.json",
      "url": "https://database-sample-website.s3.eu-north-1.amazonaws.com/datasets/product-catalogue/v1/django/fixtures.json",
      "bytes": 83548,
      "sha256": "33b73f8e0a686fa6d7dca4842c5b36ed85d323fe701b4fd0d2b2dd82e011453c",
      "rows": null,
      "contentType": "application/json; charset=utf-8"
    }
  ],
  "publishedAt": 1788733895079,
  "updatedAt": 1788733895079
}
