Database tables and views - the foundation of structured data
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
View the complete Table schema in your preferred format:
=== "JSON Schema"
**Complete JSON Schema Definition**
```json
{
"$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 →](https://github.com/open-metadata/OpenMetadataStandards/blob/main/schemas/entity/data/table.json)**
=== "RDF"
**RDF/OWL Ontology Definition**
```turtle
@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 →](https://github.com/open-metadata/OpenMetadataStandards/blob/main/rdf/ontology/openmetadata.ttl)**
=== "JSON-LD"
**JSON-LD Context and Example**
```json
{
"@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**:
```json
{
"@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 →](https://github.com/open-metadata/OpenMetadataStandards/blob/main/rdf/contexts/table.jsonld)**
- 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
Type: string (UUID format)
Required: Yes (system-generated)
Description: Unique identifier for this table instance
{
"id": "8f6a9c7e-3b2d-4a1f-9e5c-6d8b4f2a1e9c"
}Type: string
Required: Yes
Pattern: ^[^.]*$ (no dots allowed)
Min Length: 1
Max Length: 256
Description: Name of the table (unqualified)
{
"name": "customers"
}Type: string
Required: Yes (system-generated)
Pattern: ^((?!::).)*$
Description: Fully qualified name in the format service.database.schema.table
{
"fullyQualifiedName": "postgres_prod.ecommerce.public.customers"
}Type: string
Required: No
Description: Human-readable display name
{
"displayName": "Customer Master Table"
}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"
}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"
}
]
}Type: string enum
Required: No (default: Regular)
Allowed Values:
Regular- Standard database tableView- SQL viewMaterializedView- Materialized view with physical storageExternal- External table (e.g., Hive external table)Temporary- Temporary tableSecureView- Secure view (Snowflake)Transient- Transient table (Snowflake)
{
"tableType": "Regular"
}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"]
}
]
}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": "..."
}
}Type: object
Required: Yes
Description: Reference to parent database
{
"database": {
"id": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
"type": "database",
"name": "ecommerce",
"fullyQualifiedName": "postgres_prod.ecommerce"
}
}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"
}
}Type: object
Required: Yes
Description: Reference to database service
{
"service": {
"id": "c3d4e5f6-a7b8-4c9d-0e1f-2a3b4c5d6e7f",
"type": "databaseService",
"name": "postgres_prod"
}
}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"
}
}Type: object
Required: No
Description: Data domain this table belongs to
{
"domain": {
"id": "e5f6a7b8-c9d0-4e1f-2a3b-4c5d6e7f8a9b",
"type": "domain",
"name": "Sales",
"fullyQualifiedName": "Sales"
}
}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"
}
]
}Type: array
Required: No
Description: Business glossary terms linked to this table
{
"glossaryTerms": [
{
"fullyQualifiedName": "BusinessGlossary.Customer"
}
]
}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"
}
}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"
}
]
}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"
}
}
}Type: object
Required: No (system-generated)
Description: Latest profiling results
{
"profile": {
"timestamp": 1704240000000,
"rowCount": 125430,
"columnCount": 12,
"sizeInByte": 45678901,
"profileSample": 100.0,
"profileSampleType": "PERCENTAGE"
}
}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"
}
]
}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"
}
]
}Type: number
Required: Yes (system-managed)
Description: Metadata version number, incremented on changes
{
"version": 2.3
}Type: integer (Unix epoch milliseconds)
Required: Yes (system-managed)
Description: Last update timestamp
{
"updatedAt": 1704240000000
}Type: string
Required: Yes (system-managed)
Description: User who made the update
{
"updatedBy": "jane.doe"
}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
}
}{
"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"
}@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[]" ;
] .@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 .{
"@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"
}
}
}{
"@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"}
]
}
]
}- DatabaseSchema: The schema this table belongs to
- Database: The database containing this table
- DatabaseService: The service hosting the database
- Column: Individual columns within the table
- TestCase: Data quality tests on this table
- 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
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
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.
Users can follow tables to receive notifications about schema changes, data quality issues, profiling anomalies, and ownership updates. See Followers for details.
All Table operations are available under the /v1/tables endpoint.
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: TableListCreate 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: TableGet 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: TableGet a table by its unique identifier.
GET /v1/tables/{id}
Query Parameters:
- fields: Fields to include
- include: all | deleted | non-deleted
Response: TableUpdate 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: TableCreate a new table or update if it exists.
PUT /v1/tables
Content-Type: application/json
{
"name": "orders",
"databaseSchema": "postgres_prod.ecommerce.public",
"columns": [...]
}
Response: TableDelete 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 OKUpdate 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: TableGet the latest data profile for a table.
GET /v1/tables/{fqn}/tableProfile/latest
Response: TableProfile (row count, column stats, etc.)Get sample data from a table.
GET /v1/tables/{id}/sampleData
Response: TableData (sample rows)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: CustomMetricGet join information (tables joined with this table).
GET /v1/tables/{id}/joins
Response: JoinInfo[] (frequently joined tables)Get all versions of a table.
GET /v1/tables/{id}/versions
Response: EntityHistoryAdd a follower to a table.
PUT /v1/tables/{id}/followers/{userId}
Response: ChangeEventGet all followers of a table.
GET /v1/tables/{id}/followers
Response: EntityReference[]Export table metadata including schema and lineage.
GET /v1/tables/name/{name}/export
Response: CSV file with table metadataCreate or update multiple tables.
PUT /v1/tables/bulk
Content-Type: application/json
{
"entities": [...]
}
Response: BulkOperationResult- Database Service - Service configuration
- Database - Database container
- Schema - Schema namespace
- Column - Column specification
- Data Quality - Testing tables
- Lineage - Table lineage
- Profiling - Table profiling