Skip to content

Table

Database tables and views - the foundation of structured data


Overview

The Table entity represents database tables, views, and other tabular structures across all database systems. It is the most fundamental data asset in OpenMetadata, capturing schema, constraints, relationships, and metadata.

Hierarchy:

graph LR
    A[DatabaseService] --> B[Database]
    B --> C[Schema]
    C --> D[Table]
    D --> E[Column]

    style A fill:#667eea,color:#fff
    style B fill:#4facfe,color:#fff
    style C fill:#00f2fe,color:#333
    style D fill:#00f2fe,color:#333
    style E fill:#e0f2fe,color:#333


Schema Specifications

View the complete Table schema in your preferred format:

Complete JSON Schema Definition

{
  "$id": "https://open-metadata.org/schema/entity/data/table.json",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "title": "Table",
  "description": "A `Table` entity organizes data in rows and columns and is defined in a `Database Schema`.",
  "type": "object",
  "javaType": "org.openmetadata.schema.entity.data.Table",

  "definitions": {
    "tableType": {
      "description": "Type of table",
      "type": "string",
      "enum": [
        "Regular", "External", "View", "SecureView",
        "MaterializedView", "Iceberg", "Partitioned",
        "Foreign", "Transient", "Stream"
      ]
    },
    "tableConstraint": {
      "type": "object",
      "properties": {
        "constraintType": {
          "type": "string",
          "enum": ["PRIMARY_KEY", "FOREIGN_KEY", "UNIQUE"]
        },
        "columns": {
          "type": "array",
          "items": {"type": "string"}
        }
      }
    }
  },

  "properties": {
    "id": {
      "description": "Unique identifier",
      "$ref": "../../type/basic.json#/definitions/uuid"
    },
    "name": {
      "description": "Table name",
      "$ref": "../../type/basic.json#/definitions/entityName"
    },
    "fullyQualifiedName": {
      "description": "Fully qualified name: service.database.schema.table",
      "$ref": "../../type/basic.json#/definitions/fullyQualifiedEntityName"
    },
    "displayName": {
      "description": "Display name",
      "type": "string"
    },
    "description": {
      "description": "Markdown description",
      "$ref": "../../type/basic.json#/definitions/markdown"
    },
    "tableType": {
      "$ref": "#/definitions/tableType"
    },
    "columns": {
      "description": "Table columns",
      "type": "array",
      "items": {
        "$ref": "../../type/entityReference.json"
      }
    },
    "tableConstraints": {
      "type": "array",
      "items": {
        "$ref": "#/definitions/tableConstraint"
      }
    },
    "databaseSchema": {
      "description": "Parent schema",
      "$ref": "../../type/entityReference.json"
    },
    "database": {
      "description": "Parent database",
      "$ref": "../../type/entityReference.json"
    },
    "service": {
      "description": "Database service",
      "$ref": "../../type/entityReference.json"
    },
    "owner": {
      "description": "Owner (user or team)",
      "$ref": "../../type/entityReference.json"
    },
    "domain": {
      "description": "Data domain",
      "$ref": "../../type/entityReference.json"
    },
    "tags": {
      "description": "Classification tags",
      "type": "array",
      "items": {
        "$ref": "../../type/tagLabel.json"
      }
    },
    "glossaryTerms": {
      "description": "Business glossary terms",
      "type": "array",
      "items": {
        "$ref": "../../type/entityReference.json"
      }
    },
    "version": {
      "description": "Metadata version",
      "$ref": "../../type/entityHistory.json#/definitions/entityVersion"
    }
  },

  "required": ["id", "name", "columns", "databaseSchema"]
}

View Full JSON Schema →

RDF/OWL Ontology Definition

@prefix om: <https://open-metadata.org/schema/> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix owl: <http://www.w3.org/2001/XMLSchema#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

# Table Class Definition
om:Table a owl:Class ;
    rdfs:subClassOf om:DataAsset ;
    rdfs:label "Table" ;
    rdfs:comment "A database table or view containing structured data in rows and columns" ;
    om:hierarchyLevel 4 .

# Properties
om:tableName a owl:DatatypeProperty ;
    rdfs:domain om:Table ;
    rdfs:range xsd:string ;
    rdfs:label "name" ;
    rdfs:comment "Name of the table" .

om:fullyQualifiedName a owl:DatatypeProperty ;
    rdfs:domain om:Table ;
    rdfs:range xsd:string ;
    rdfs:label "fullyQualifiedName" ;
    rdfs:comment "Complete hierarchical name: service.database.schema.table" .

om:tableType a owl:DatatypeProperty ;
    rdfs:domain om:Table ;
    rdfs:range om:TableType ;
    rdfs:label "tableType" ;
    rdfs:comment "Type of table: Regular, View, MaterializedView, etc." .

om:hasColumn a owl:ObjectProperty ;
    rdfs:domain om:Table ;
    rdfs:range om:Column ;
    rdfs:label "hasColumn" ;
    rdfs:comment "Columns in this table" .

om:belongsToSchema a owl:ObjectProperty ;
    rdfs:domain om:Table ;
    rdfs:range om:DatabaseSchema ;
    rdfs:label "belongsToSchema" ;
    rdfs:comment "Parent database schema" .

om:ownedBy a owl:ObjectProperty ;
    rdfs:domain om:Table ;
    rdfs:range om:Owner ;
    rdfs:label "ownedBy" ;
    rdfs:comment "User or team that owns this table" .

om:hasTag a owl:ObjectProperty ;
    rdfs:domain om:Table ;
    rdfs:range om:Tag ;
    rdfs:label "hasTag" ;
    rdfs:comment "Classification tags applied to table" .

om:linkedToGlossaryTerm a owl:ObjectProperty ;
    rdfs:domain om:Table ;
    rdfs:range om:GlossaryTerm ;
    rdfs:label "linkedToGlossaryTerm" ;
    rdfs:comment "Business glossary terms" .

# Table Type Enumeration
om:TableType a owl:Class ;
    owl:oneOf (
        om:RegularTable
        om:ViewTable
        om:MaterializedViewTable
        om:ExternalTable
        om:TransientTable
    ) .

# Example Instance
ex:customersTable a om:Table ;
    om:tableName "customers" ;
    om:fullyQualifiedName "postgres_prod.ecommerce.public.customers" ;
    om:tableType om:RegularTable ;
    om:belongsToSchema ex:publicSchema ;
    om:ownedBy ex:janeDoe ;
    om:hasTag ex:tierGold ;
    om:hasTag ex:complianceGDPR ;
    om:linkedToGlossaryTerm ex:customerTerm ;
    om:hasColumn ex:customerIdColumn ;
    om:hasColumn ex:emailColumn .

View Full RDF Ontology →

JSON-LD Context and Example

{
  "@context": {
    "@vocab": "https://open-metadata.org/schema/",
    "om": "https://open-metadata.org/schema/",
    "rdfs": "http://www.w3.org/2000/01/rdf-schema#",
    "xsd": "http://www.w3.org/2001/XMLSchema#",

    "Table": "om:Table",
    "name": {
      "@id": "om:tableName",
      "@type": "xsd:string"
    },
    "fullyQualifiedName": {
      "@id": "om:fullyQualifiedName",
      "@type": "xsd:string"
    },
    "displayName": {
      "@id": "om:displayName",
      "@type": "xsd:string"
    },
    "description": {
      "@id": "om:description",
      "@type": "xsd:string"
    },
    "tableType": {
      "@id": "om:tableType",
      "@type": "@vocab"
    },
    "columns": {
      "@id": "om:hasColumn",
      "@type": "@id",
      "@container": "@list"
    },
    "databaseSchema": {
      "@id": "om:belongsToSchema",
      "@type": "@id"
    },
    "database": {
      "@id": "om:belongsToDatabase",
      "@type": "@id"
    },
    "service": {
      "@id": "om:belongsToService",
      "@type": "@id"
    },
    "owner": {
      "@id": "om:ownedBy",
      "@type": "@id"
    },
    "domain": {
      "@id": "om:inDomain",
      "@type": "@id"
    },
    "tags": {
      "@id": "om:hasTag",
      "@type": "@id",
      "@container": "@set"
    },
    "glossaryTerms": {
      "@id": "om:linkedToGlossaryTerm",
      "@type": "@id",
      "@container": "@set"
    }
  }
}

Example JSON-LD Instance:

{
  "@context": "https://open-metadata.org/context/table.jsonld",
  "@type": "Table",
  "@id": "https://example.com/data/tables/customers",

  "name": "customers",
  "fullyQualifiedName": "postgres_prod.ecommerce.public.customers",
  "displayName": "Customer Master Table",
  "description": "Contains all customer records with contact information",
  "tableType": "Regular",

  "databaseSchema": {
    "@id": "https://example.com/data/schemas/public",
    "@type": "DatabaseSchema",
    "name": "public"
  },

  "database": {
    "@id": "https://example.com/data/databases/ecommerce",
    "@type": "Database",
    "name": "ecommerce"
  },

  "service": {
    "@id": "https://example.com/services/postgres_prod",
    "@type": "DatabaseService",
    "name": "postgres_prod"
  },

  "owner": {
    "@id": "https://example.com/users/jane.doe",
    "@type": "User",
    "name": "jane.doe",
    "displayName": "Jane Doe"
  },

  "tags": [
    {
      "@id": "https://open-metadata.org/tags/Tier/Gold",
      "tagFQN": "Tier.Gold"
    },
    {
      "@id": "https://open-metadata.org/tags/Compliance/GDPR",
      "tagFQN": "Compliance.GDPR"
    }
  ],

  "glossaryTerms": [
    {
      "@id": "https://example.com/glossary/Customer",
      "@type": "GlossaryTerm",
      "fullyQualifiedName": "BusinessGlossary.Customer"
    }
  ],

  "columns": [
    {
      "@type": "Column",
      "@id": "https://example.com/data/tables/customers/columns/customer_id",
      "name": "customer_id",
      "dataType": "BIGINT",
      "constraint": "PRIMARY_KEY"
    },
    {
      "@type": "Column",
      "@id": "https://example.com/data/tables/customers/columns/email",
      "name": "email",
      "dataType": "VARCHAR",
      "dataLength": 255,
      "tags": [
        {
          "@id": "https://open-metadata.org/tags/PII/Sensitive/Email"
        }
      ]
    }
  ]
}

View Full JSON-LD Context →


Use Cases

  • Catalog all tables across databases (PostgreSQL, MySQL, Snowflake, BigQuery, etc.)
  • Document table purpose, columns, and relationships
  • Track table ownership and domain assignment
  • Apply governance tags (PII, PHI, Compliance)
  • Run data quality tests
  • Capture lineage from source to consumption
  • Profile table statistics
  • Define data contracts

JSON Schema Specification

Core Properties

id (uuid)

Type: string (UUID format) Required: Yes (system-generated) Description: Unique identifier for this table instance

{
  "id": "8f6a9c7e-3b2d-4a1f-9e5c-6d8b4f2a1e9c"
}

name (entityName)

Type: string Required: Yes Pattern: ^[^.]*$ (no dots allowed) Min Length: 1 Max Length: 256 Description: Name of the table (unqualified)

{
  "name": "customers"
}

fullyQualifiedName (fullyQualifiedEntityName)

Type: string Required: Yes (system-generated) Pattern: ^((?!::).)*$ Description: Fully qualified name in the format service.database.schema.table

{
  "fullyQualifiedName": "postgres_prod.ecommerce.public.customers"
}

displayName

Type: string Required: No Description: Human-readable display name

{
  "displayName": "Customer Master Table"
}

description (markdown)

Type: string (Markdown format) Required: No Description: Rich text description of the table's purpose and usage

{
  "description": "# Customer Master Table\n\nContains all customer records with contact information, preferences, and lifecycle status.\n\n## Usage\n- Primary source for customer data\n- Updated nightly via `customer_etl` pipeline\n- Used by Customer Analytics dashboard"
}

Structure Properties

columns[] (Column[])

Type: array of Column objects Required: Yes Description: List of columns in the table

Column Object Properties:

Property Type Required Description
name string Yes Column name
displayName string No Display name
dataType DataType enum Yes Column data type
dataTypeDisplay string No Formatted type (e.g., "varchar(255)")
description markdown No Column description
dataLength integer No Length for string types
precision integer No Precision for numeric types
scale integer No Scale for numeric types
ordinalPosition integer No Position in table
constraint Constraint enum No PRIMARY_KEY, UNIQUE, NOT_NULL, FOREIGN_KEY
tags TagLabel[] No Tags applied to column
glossaryTerms GlossaryTerm[] No Business terms
customMetrics CustomMetric[] No Custom column metrics

Example:

{
  "columns": [
    {
      "name": "customer_id",
      "dataType": "BIGINT",
      "dataTypeDisplay": "bigint",
      "description": "Unique identifier for the customer",
      "ordinalPosition": 1,
      "constraint": "PRIMARY_KEY",
      "tags": [
        {
          "tagFQN": "Tier.Gold",
          "source": "Classification"
        }
      ]
    },
    {
      "name": "email",
      "dataType": "VARCHAR",
      "dataLength": 255,
      "dataTypeDisplay": "varchar(255)",
      "description": "Customer email address",
      "ordinalPosition": 2,
      "constraint": "UNIQUE",
      "tags": [
        {
          "tagFQN": "PII.Sensitive.Email",
          "source": "Classification"
        },
        {
          "tagFQN": "Compliance.GDPR",
          "source": "Classification"
        }
      ],
      "glossaryTerms": [
        {
          "fullyQualifiedName": "BusinessGlossary.EmailAddress"
        }
      ]
    },
    {
      "name": "first_name",
      "dataType": "VARCHAR",
      "dataLength": 100,
      "dataTypeDisplay": "varchar(100)",
      "ordinalPosition": 3,
      "tags": [
        {
          "tagFQN": "PII.NonSensitive.Name",
          "source": "Classification"
        }
      ]
    },
    {
      "name": "created_at",
      "dataType": "TIMESTAMP",
      "dataTypeDisplay": "timestamp",
      "description": "Account creation timestamp",
      "ordinalPosition": 4,
      "constraint": "NOT_NULL"
    }
  ]
}

tableType (TableType enum)

Type: string enum Required: No (default: Regular) Allowed Values:

  • Regular - Standard database table
  • View - SQL view
  • MaterializedView - Materialized view with physical storage
  • External - External table (e.g., Hive external table)
  • Temporary - Temporary table
  • SecureView - Secure view (Snowflake)
  • Transient - Transient table (Snowflake)
{
  "tableType": "Regular"
}

tableConstraints[] (TableConstraint[])

Type: array Required: No Description: Primary keys, foreign keys, and other table-level constraints

TableConstraint Object:

{
  "tableConstraints": [
    {
      "constraintType": "PRIMARY_KEY",
      "columns": ["customer_id"]
    },
    {
      "constraintType": "FOREIGN_KEY",
      "columns": ["country_id"],
      "referredColumns": ["countries.country_id"]
    },
    {
      "constraintType": "UNIQUE",
      "columns": ["email"]
    }
  ]
}

dataModel (DataModel)

Type: object Required: No (required for views) Description: SQL query defining the view

{
  "dataModel": {
    "isPartitioned": false,
    "sql": "SELECT c.customer_id, c.email, c.first_name, o.order_count FROM customers c LEFT JOIN (SELECT customer_id, COUNT(*) as order_count FROM orders GROUP BY customer_id) o ON c.customer_id = o.customer_id",
    "columns": ["customer_id", "email", "first_name", "order_count"],
    "rawDataModel": "..."
  }
}

Location Properties

database (EntityReference)

Type: object Required: Yes Description: Reference to parent database

{
  "database": {
    "id": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
    "type": "database",
    "name": "ecommerce",
    "fullyQualifiedName": "postgres_prod.ecommerce"
  }
}

databaseSchema (EntityReference)

Type: object Required: Yes Description: Reference to parent schema

{
  "databaseSchema": {
    "id": "b2c3d4e5-f6a7-4b8c-9d0e-1f2a3b4c5d6e",
    "type": "databaseSchema",
    "name": "public",
    "fullyQualifiedName": "postgres_prod.ecommerce.public"
  }
}

service (EntityReference)

Type: object Required: Yes Description: Reference to database service

{
  "service": {
    "id": "c3d4e5f6-a7b8-4c9d-0e1f-2a3b4c5d6e7f",
    "type": "databaseService",
    "name": "postgres_prod"
  }
}

Governance Properties

owner (EntityReference)

Type: object Required: No Description: User or team that owns this table

{
  "owner": {
    "id": "d4e5f6a7-b8c9-4d0e-1f2a-3b4c5d6e7f8a",
    "type": "user",
    "name": "jane.doe",
    "displayName": "Jane Doe"
  }
}

domain (EntityReference)

Type: object Required: No Description: Data domain this table belongs to

{
  "domain": {
    "id": "e5f6a7b8-c9d0-4e1f-2a3b-4c5d6e7f8a9b",
    "type": "domain",
    "name": "Sales",
    "fullyQualifiedName": "Sales"
  }
}

tags[] (TagLabel[])

Type: array Required: No Description: Classification tags applied to the table

{
  "tags": [
    {
      "tagFQN": "Tier.Gold",
      "description": "Critical business data",
      "source": "Classification",
      "labelType": "Manual",
      "state": "Confirmed"
    },
    {
      "tagFQN": "Compliance.GDPR",
      "source": "Classification",
      "labelType": "Manual",
      "state": "Confirmed"
    }
  ]
}

glossaryTerms[] (GlossaryTerm[])

Type: array Required: No Description: Business glossary terms linked to this table

{
  "glossaryTerms": [
    {
      "fullyQualifiedName": "BusinessGlossary.Customer"
    }
  ]
}

Data Quality Properties

testSuite (EntityReference)

Type: object Required: No Description: Test suite for this table's quality tests

{
  "testSuite": {
    "id": "f6a7b8c9-d0e1-4f2a-3b4c-5d6e7f8a9b0c",
    "type": "testSuite",
    "name": "customers_test_suite",
    "fullyQualifiedName": "postgres_prod.ecommerce.public.customers.testSuite"
  }
}

dataQualityTests[] (TestCase[])

Type: array Required: No Description: List of quality tests applied to this table

{
  "dataQualityTests": [
    {
      "id": "test-1-uuid",
      "type": "testCase",
      "name": "customer_id_unique",
      "testDefinition": "columnValuesToBeUnique"
    }
  ]
}

Profiling Properties

tableProfilerConfig (TableProfilerConfig)

Type: object Required: No Description: Configuration for data profiling

{
  "tableProfilerConfig": {
    "profileSample": 100,
    "profileSampleType": "PERCENTAGE",
    "sampleDataCount": 50,
    "excludeColumns": ["internal_notes"],
    "includeColumns": [
      {
        "columnName": "email",
        "metrics": ["DISTINCT_COUNT", "NULL_COUNT", "UNIQUE_COUNT"]
      }
    ],
    "partitionConfig": {
      "enablePartitioning": true,
      "partitionColumnName": "created_date",
      "partitionIntervalType": "COLUMN-VALUE"
    }
  }
}

profile (TableProfile)

Type: object Required: No (system-generated) Description: Latest profiling results

{
  "profile": {
    "timestamp": 1704240000000,
    "rowCount": 125430,
    "columnCount": 12,
    "sizeInByte": 45678901,
    "profileSample": 100.0,
    "profileSampleType": "PERCENTAGE"
  }
}

Lineage Properties

upstream (EntityLineage)

Type: array Required: No Description: Upstream tables/assets that feed into this table

{
  "upstream": [
    {
      "id": "source-table-uuid",
      "type": "table",
      "name": "raw_customers",
      "fullyQualifiedName": "postgres_prod.staging.raw_customers"
    }
  ]
}

downstream (EntityLineage)

Type: array Required: No Description: Downstream assets that consume this table

{
  "downstream": [
    {
      "id": "dashboard-uuid",
      "type": "dashboard",
      "name": "Customer Analytics",
      "fullyQualifiedName": "tableau.CustomerAnalytics"
    },
    {
      "id": "mlmodel-uuid",
      "type": "mlmodel",
      "name": "churn_predictor_v2"
    }
  ]
}

Versioning Properties

version (entityVersion)

Type: number Required: Yes (system-managed) Description: Metadata version number, incremented on changes

{
  "version": 2.3
}

updatedAt (timestamp)

Type: integer (Unix epoch milliseconds) Required: Yes (system-managed) Description: Last update timestamp

{
  "updatedAt": 1704240000000
}

updatedBy (string)

Type: string Required: Yes (system-managed) Description: User who made the update

{
  "updatedBy": "jane.doe"
}

changeDescription (ChangeDescription)

Type: object Required: No Description: Details of what changed in this version

{
  "changeDescription": {
    "fieldsAdded": [
      {
        "name": "columns.loyalty_tier",
        "newValue": "varchar(50)"
      }
    ],
    "fieldsUpdated": [
      {
        "name": "description",
        "oldValue": "Customer table",
        "newValue": "# Customer Master Table\n\nContains all customer records..."
      }
    ],
    "fieldsDeleted": [],
    "previousVersion": 2.2
  }
}

Complete Example

{
  "id": "8f6a9c7e-3b2d-4a1f-9e5c-6d8b4f2a1e9c",
  "name": "customers",
  "fullyQualifiedName": "postgres_prod.ecommerce.public.customers",
  "displayName": "Customer Master Table",
  "description": "# Customer Master Table\n\nContains all customer records with contact information, preferences, and lifecycle status.",
  "tableType": "Regular",
  "columns": [
    {
      "name": "customer_id",
      "dataType": "BIGINT",
      "dataTypeDisplay": "bigint",
      "description": "Unique identifier for the customer",
      "ordinalPosition": 1,
      "constraint": "PRIMARY_KEY"
    },
    {
      "name": "email",
      "dataType": "VARCHAR",
      "dataLength": 255,
      "dataTypeDisplay": "varchar(255)",
      "description": "Customer email address",
      "ordinalPosition": 2,
      "constraint": "UNIQUE",
      "tags": [
        {"tagFQN": "PII.Sensitive.Email"},
        {"tagFQN": "Compliance.GDPR"}
      ]
    },
    {
      "name": "first_name",
      "dataType": "VARCHAR",
      "dataLength": 100,
      "dataTypeDisplay": "varchar(100)",
      "ordinalPosition": 3,
      "tags": [{"tagFQN": "PII.NonSensitive.Name"}]
    },
    {
      "name": "created_at",
      "dataType": "TIMESTAMP",
      "dataTypeDisplay": "timestamp",
      "description": "Account creation timestamp",
      "ordinalPosition": 4,
      "constraint": "NOT_NULL"
    }
  ],
  "tableConstraints": [
    {
      "constraintType": "PRIMARY_KEY",
      "columns": ["customer_id"]
    }
  ],
  "database": {
    "id": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
    "type": "database",
    "name": "ecommerce"
  },
  "databaseSchema": {
    "id": "b2c3d4e5-f6a7-4b8c-9d0e-1f2a3b4c5d6e",
    "type": "databaseSchema",
    "name": "public"
  },
  "service": {
    "id": "c3d4e5f6-a7b8-4c9d-0e1f-2a3b4c5d6e7f",
    "type": "databaseService",
    "name": "postgres_prod"
  },
  "owner": {
    "id": "d4e5f6a7-b8c9-4d0e-1f2a-3b4c5d6e7f8a",
    "type": "user",
    "name": "jane.doe"
  },
  "domain": {
    "id": "e5f6a7b8-c9d0-4e1f-2a3b-4c5d6e7f8a9b",
    "type": "domain",
    "name": "Sales"
  },
  "tags": [
    {"tagFQN": "Tier.Gold"},
    {"tagFQN": "Compliance.GDPR"}
  ],
  "glossaryTerms": [
    {"fullyQualifiedName": "BusinessGlossary.Customer"}
  ],
  "version": 2.3,
  "updatedAt": 1704240000000,
  "updatedBy": "jane.doe"
}

RDF Representation

Ontology Class

@prefix om: <https://open-metadata.org/schema/> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix owl: <http://www.w3.org/2001/XMLSchema#> .

om:Table a owl:Class ;
    rdfs:subClassOf om:DataAsset ;
    rdfs:label "Table" ;
    rdfs:comment "A database table or view containing structured data" ;
    om:hasProperties [
        om:name "string" ;
        om:columns "Column[]" ;
        om:tableType "TableType" ;
        om:databaseSchema "DatabaseSchema" ;
        om:owner "Owner" ;
        om:tags "Tag[]" ;
    ] .

Instance Example

@prefix om: <https://open-metadata.org/schema/> .
@prefix ex: <https://example.com/data/> .

ex:customers a om:Table ;
    om:name "customers" ;
    om:fullyQualifiedName "postgres_prod.ecommerce.public.customers" ;
    om:displayName "Customer Master Table" ;
    om:description "Contains all customer records" ;
    om:tableType "Regular" ;
    om:belongsTo ex:public_schema ;
    om:ownedBy ex:jane_doe ;
    om:hasTag ex:tier_gold ;
    om:hasTag ex:compliance_gdpr ;
    om:linkedToGlossaryTerm ex:customer_term ;
    om:hasColumn ex:customer_id ;
    om:hasColumn ex:email ;
    om:hasColumn ex:first_name .

JSON-LD Context

{
  "@context": {
    "@vocab": "https://open-metadata.org/schema/",
    "om": "https://open-metadata.org/schema/",
    "rdfs": "http://www.w3.org/2000/01/rdf-schema#",
    "Table": "om:Table",
    "name": "om:name",
    "fullyQualifiedName": "om:fullyQualifiedName",
    "displayName": "om:displayName",
    "description": "om:description",
    "columns": {
      "@id": "om:hasColumn",
      "@type": "@id",
      "@container": "@list"
    },
    "databaseSchema": {
      "@id": "om:belongsTo",
      "@type": "@id"
    },
    "owner": {
      "@id": "om:ownedBy",
      "@type": "@id"
    },
    "tags": {
      "@id": "om:hasTag",
      "@type": "@id",
      "@container": "@set"
    },
    "glossaryTerms": {
      "@id": "om:linkedToGlossaryTerm",
      "@type": "@id",
      "@container": "@set"
    }
  }
}

JSON-LD Example

{
  "@context": "https://open-metadata.org/context/table.jsonld",
  "@type": "Table",
  "@id": "https://example.com/data/customers",
  "name": "customers",
  "fullyQualifiedName": "postgres_prod.ecommerce.public.customers",
  "displayName": "Customer Master Table",
  "tableType": "Regular",
  "databaseSchema": {
    "@id": "https://example.com/data/public_schema",
    "@type": "DatabaseSchema"
  },
  "owner": {
    "@id": "https://example.com/users/jane_doe",
    "@type": "User"
  },
  "tags": [
    {"@id": "https://open-metadata.org/tags/Tier/Gold"},
    {"@id": "https://open-metadata.org/tags/Compliance/GDPR"}
  ],
  "columns": [
    {
      "@type": "Column",
      "name": "customer_id",
      "dataType": "BIGINT",
      "constraint": "PRIMARY_KEY"
    },
    {
      "@type": "Column",
      "name": "email",
      "dataType": "VARCHAR",
      "dataLength": 255,
      "tags": [
        {"@id": "https://open-metadata.org/tags/PII/Sensitive/Email"}
      ]
    }
  ]
}

Relationships

Parent Entities

  • DatabaseSchema: The schema this table belongs to
  • Database: The database containing this table
  • DatabaseService: The service hosting the database

Child Entities

  • Column: Individual columns within the table
  • TestCase: Data quality tests on this table

Associated Entities

  • Owner: User or team owning this table
  • Domain: Business domain assignment
  • Tag: Classification tags
  • GlossaryTerm: Business terminology
  • Dashboard: Dashboards using this table
  • MLModel: ML models trained on this table
  • Pipeline: Pipelines reading/writing this table

Relationship Diagram

graph TD
    %% Hierarchical relationships - Up and down the hierarchy
    SVC[DatabaseService<br/>postgres_prod] -->|contains| DB[Database<br/>ecommerce]
    DB -->|contains| SCH[Schema<br/>public]
    SCH -->|contains| TBL[Table<br/>customers]
    TBL -->|has| COL1[Column<br/>customer_id]
    TBL -->|has| COL2[Column<br/>email]
    TBL -->|has| COL3[Column<br/>first_name]
    TBL -->|has| COL4[Column<br/>created_at]

    %% Cross-entity relationships - Ownership
    USR[User<br/>jane.doe] -.->|owns| TBL
    TEAM[Team<br/>DataEngineering] -.->|owns| TBL

    %% Cross-entity relationships - Governance
    DOM[Domain<br/>Sales] -.->|groups| TBL
    TAG1[Tag<br/>Tier.Gold] -.->|classifies| TBL
    TAG2[Tag<br/>Compliance.GDPR] -.->|classifies| TBL
    TAG3[Tag<br/>PII.Sensitive.Email] -.->|classifies| COL2
    TAG4[Tag<br/>PII.NonSensitive.Name] -.->|classifies| COL3
    GT[GlossaryTerm<br/>Customer] -.->|describes| TBL

    %% Cross-entity relationships - Quality
    TS[TestSuite<br/>customers_suite] -.->|validates| TBL
    TC1[TestCase<br/>row_count_check] -.->|tests| TBL
    TC2[TestCase<br/>customer_id_unique] -.->|tests| COL1
    TC3[TestCase<br/>email_format] -.->|tests| COL2

    %% Cross-entity relationships - Lineage
    SRC1[Table<br/>raw_customers] -.->|upstream| TBL
    PIPE[Pipeline<br/>customer_etl] -.->|writes to| TBL
    TBL -.->|downstream| DASH[Dashboard<br/>Customer Analytics]
    TBL -.->|downstream| ML[MLModel<br/>churn_predictor]
    TBL -.->|downstream| TGT[Table<br/>customer_summary]

    %% Cross-entity relationships - Usage
    QUERY[Query<br/>top_customers] -.->|uses| TBL
    JOIN[JoinInfo] -.->|links| TBL

    %% Data Profiling
    PROF[TableProfile<br/>statistics] -.->|profiles| TBL

    %% Styling
    classDef service fill:#7C3AED,stroke:#5B21B6,color:#fff
    classDef data fill:#2563EB,stroke:#1E40AF,color:#fff,stroke-width:3px
    classDef column fill:#60A5FA,stroke:#3B82F6,color:#fff
    classDef governance fill:#059669,stroke:#047857,color:#fff
    classDef quality fill:#DC2626,stroke:#B91C1C,color:#fff
    classDef lineage fill:#F59E0B,stroke:#D97706,color:#fff
    classDef usage fill:#8B5CF6,stroke:#7C3AED,color:#fff

    class SVC service
    class DB,SCH,TBL,SRC1,TGT data
    class COL1,COL2,COL3,COL4 column
    class USR,TEAM,DOM,TAG1,TAG2,TAG3,TAG4,GT governance
    class TS,TC1,TC2,TC3 quality
    class PIPE,DASH,ML lineage
    class QUERY,JOIN,PROF usage

Custom Properties

This entity supports custom properties through the extension field. Common custom properties include:

  • Data Classification: Sensitivity level
  • Cost Center: Billing allocation
  • Retention Period: Data retention requirements
  • Application Owner: Owning application/team

See Custom Properties for details on defining and using custom properties.


Followers

Users can follow tables to receive notifications about schema changes, data quality issues, profiling anomalies, and ownership updates. See Followers for details.


API Operations

All Table operations are available under the /v1/tables endpoint.

List Tables

Get a list of tables, optionally filtered by database or schema.

GET /v1/tables
Query Parameters:
  - fields: Fields to include (columns, tags, owners, profile, joins, etc.)
  - database: Filter by database FQN (e.g., snowflakeWestCoast.financeDB)
  - databaseSchema: Filter by schema FQN
  - includeEmptyTestSuite: Include tables without test cases (default: true)
  - limit: Number of results (1-1000000, default 10)
  - before/after: Cursor-based pagination
  - include: all | deleted | non-deleted (default: non-deleted)

Response: TableList

Create Table

Create a new table under a database schema.

POST /v1/tables
Content-Type: application/json

{
  "name": "customers",
  "databaseSchema": "postgres_prod.ecommerce.public",
  "description": "Customer master table",
  "columns": [
    {
      "name": "customer_id",
      "dataType": "BIGINT",
      "description": "Unique customer identifier",
      "constraint": "PRIMARY_KEY"
    },
    {
      "name": "email",
      "dataType": "VARCHAR",
      "dataLength": 255,
      "tags": [{"tagFQN": "PII.Email"}]
    },
    {
      "name": "created_at",
      "dataType": "TIMESTAMP"
    }
  ],
  "tableConstraints": [
    {
      "constraintType": "PRIMARY_KEY",
      "columns": ["customer_id"]
    }
  ]
}

Response: Table

Get Table by Name

Get a table by its fully qualified name.

GET /v1/tables/name/{fqn}
Query Parameters:
  - fields: Fields to include
  - include: all | deleted | non-deleted

Example:
GET /v1/tables/name/postgres_prod.ecommerce.public.customers?fields=columns,tags,owner,profile,joins

Response: Table

Get Table by ID

Get a table by its unique identifier.

GET /v1/tables/{id}
Query Parameters:
  - fields: Fields to include
  - include: all | deleted | non-deleted

Response: Table

Update Table

Update a table using JSON Patch.

PATCH /v1/tables/name/{fqn}
Content-Type: application/json-patch+json

[
  {"op": "add", "path": "/tags/-", "value": {"tagFQN": "Tier.Gold"}},
  {"op": "replace", "path": "/description", "value": "Updated customer master table"},
  {"op": "add", "path": "/owner", "value": {"id": "...", "type": "team"}}
]

Response: Table

Create or Update Table

Create a new table or update if it exists.

PUT /v1/tables
Content-Type: application/json

{
  "name": "orders",
  "databaseSchema": "postgres_prod.ecommerce.public",
  "columns": [...]
}

Response: Table

Delete Table

Delete a table by fully qualified name.

DELETE /v1/tables/name/{fqn}
Query Parameters:
  - recursive: Delete with constraints (default: false)
  - hardDelete: Permanently delete (default: false)

Response: 200 OK

Update Columns

Update table column definitions.

PUT /v1/tables/{id}/columns
Content-Type: application/json

{
  "columns": [
    {
      "name": "loyalty_tier",
      "dataType": "VARCHAR",
      "dataLength": 50,
      "description": "Customer loyalty tier",
      "tags": [{"tagFQN": "BusinessCritical"}]
    }
  ]
}

Response: Table

Get Table Profile

Get the latest data profile for a table.

GET /v1/tables/{fqn}/tableProfile/latest

Response: TableProfile (row count, column stats, etc.)

Get Table Sample Data

Get sample data from a table.

GET /v1/tables/{id}/sampleData

Response: TableData (sample rows)

Add Custom Metric

Add a custom metric to track for this table.

PUT /v1/tables/{id}/customMetric
Content-Type: application/json

{
  "name": "revenue_per_customer",
  "expression": "SUM(order_amount) / COUNT(DISTINCT customer_id)",
  "columnName": "order_amount"
}

Response: CustomMetric

Get Table Joins

Get join information (tables joined with this table).

GET /v1/tables/{id}/joins

Response: JoinInfo[] (frequently joined tables)

Get Table Versions

Get all versions of a table.

GET /v1/tables/{id}/versions

Response: EntityHistory

Follow Table

Add a follower to a table.

PUT /v1/tables/{id}/followers/{userId}

Response: ChangeEvent

Get Followers

Get all followers of a table.

GET /v1/tables/{id}/followers

Response: EntityReference[]

Export Table Metadata

Export table metadata including schema and lineage.

GET /v1/tables/name/{name}/export

Response: CSV file with table metadata

Bulk Operations

Create or update multiple tables.

PUT /v1/tables/bulk
Content-Type: application/json

{
  "entities": [...]
}

Response: BulkOperationResult