The ability to link records across tables is one of the key features of both Postgres and Airtable. In this guide, we walk through how to maintain record relations between the two with a Bracket sync.
In Postgres, you define relations between tables using foreign keys. A foreign key is simply a field that contains the primary key of another table.For example, let’s say you run a rental car service, and you have two tables: customers and reservations. In this case, each customer can make many reservations over time, but each reservation only belongs to one customer. This is a one-to-many relationship. In Postgres, both tables would have primary key fields, but reservations would also have a foreign key column that holds values from the customers primary key.In this case, we call records from customers the “parent record,” and records from reservations the “children records.”
In Airtable, you define relations between tables in a base using linked record fields. When linking records in Airtable, you create a two-way relationship between the records in each table, allowing you to add lookup and rollup fields that reference the linked record.However, unlike Postgres, where relations are most commonly 1:many or 1:1 between two tables, in Airtable it’s common to find 1:many, 1:1, and many:many relations between tables. Right now, Bracket only supports 1:1 and 1:many relations between Airtable and Postgres.
Going back to the customers and reservations example, here’s a step-by-step guide:
Add a field with the Airtable record ID to the customers, and make sure that field syncs to Postgres.
In Postgres, enforce a unique constraint on this record ID field for the customers table.
Sync your Airtable data to Postgres for the customers table.
In Postgres, in the reservations table, add a foreign key constraint on the linked record field in Airtable that references customers.
Sync your Airtable data to Postgres for the reservations table.
{"docsConfig":{"$schema":"https://mintlify.com/docs.json","theme":"mint","name":"Bracket","colors":{"primary":"#47689E","light":"#7F97B9","dark":"#2B3A4F"},"favicon":"/favicon.png","logo":{"light":"https://mintcdn.com/bracket/bx6DzcifAPUE0Au7/logo/light.svg?fit=max\u0026auto=format\u0026n=bx6DzcifAPUE0Au7\u0026q=85\u0026s=c72851b277e1f0dfa02b8178da42620b","dark":"https://mintcdn.com/bracket/bx6DzcifAPUE0Au7/logo/dark.svg?fit=max\u0026auto=format\u0026n=bx6DzcifAPUE0Au7\u0026q=85\u0026s=a976a75a3904568c031355265c1a1888"},"navbar":{"links":[{"label":"Blog","href":"https://www.usebracket.com/blog"}],"primary":{"type":"button","label":"Get Started","href":"https://app.usebracket.com/"}},"footer":{"socials":{"website":"https://www.usebracket.com"}},"integrations":{"amplitude":{"apiKey":"fe0ecf4d83519f7738f8bb24244f9bd7"},"hotjar":{"hjid":"3130374","hjsv":"6"}},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"bracket","hasAudioNarration":false,"actualSubdomain":"bracket","customDomains":["docs.usebracket.com"],"gitSource":{"type":"github","owner":"usebracket","repo":"documentation","deployBranch":"main","contentDirectory":"docs","mountPath":"","label":""},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6ae913e47b2166ad6023e727:success","clientVersion":"0.0.4088","searchFilterCounts":[{"language":"default","tag":"Documentation","count":31},{"language":"default","tag":"Integrations","count":21},{"language":"default","tag":"Guides","count":6},{"language":"default","tag":"Postgres","count":4},{"language":"default","tag":"Introduction","count":4},{"language":"default","tag":"Airtable","count":2},{"language":"default","tag":"Firestore","count":2},{"language":"default","tag":"Google Sheets","count":2},{"language":"default","tag":"MongoDB","count":2},{"language":"default","tag":"Notion","count":2}]},"assistantConfig":{},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"comment-mode","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"guides/foreign_keys","slug":"/guides/foreign_keys","pageMetadata":{"title":"Postgres \u003c> Airtable Relations Guide","sidebarTitle":"Postgres \u003c> Airtable guide","description":"How to maintain record relationships between Postgres and Airtable","href":"/guides/foreign_keys"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"How to maintain record relationships between Postgres and Airtable\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={code:`code`,em:`em`,li:`li`,ol:`ol`,p:`p`,strong:`strong`,..._provideComponents(),...props.components},{Heading,Tip}=_components;if(!Heading)_missingMdxReference(`Heading`,true);if(!Tip)_missingMdxReference(`Tip`,true);return _jsxs(_Fragment,{children:[_jsx(Heading,{level:`2`,id:`summary`,children:`Summary`}),`\n`,_jsx(_components.p,{children:`The ability to link records across tables is one of the key features of both Postgres and Airtable. In this guide, we walk through how to maintain record relations between the two with a Bracket sync.`}),`\n`,_jsx(Heading,{level:`2`,id:`how-does-postgres-handle-relations`,children:`How does Postgres handle relations?`}),`\n`,_jsx(_components.p,{children:`In Postgres, you define relations between tables using foreign keys. A foreign key is simply a field that contains the primary key of another table.`}),`\n`,_jsxs(_components.p,{children:[`For example, let’s say you run a rental car service, and you have two tables: `,_jsx(_components.code,{children:`customers`}),` and `,_jsx(_components.code,{children:`reservations`}),`. In this case, each customer can make many reservations over time, but each reservation only belongs to one customer. This is a `,_jsx(_components.strong,{children:`one-to-many`}),` relationship. In Postgres, both tables would have primary key fields, but `,_jsx(_components.code,{children:`reservations`}),` would also have a foreign key column that holds values from the `,_jsx(_components.code,{children:`customers`}),` primary key.`]}),`\n`,_jsxs(_components.p,{children:[`In this case, we call records from `,_jsx(_components.code,{children:`customers`}),` the “parent record,” and records from `,_jsx(_components.code,{children:`reservations`}),` the “children records.”`]}),`\n`,_jsx(Heading,{level:`2`,id:`how-does-airtable-handle-relations`,children:`How does Airtable handle relations?`}),`\n`,_jsx(_components.p,{children:`In Airtable, you define relations between tables in a base using linked record fields. When linking records in Airtable, you create a two-way relationship between the records in each table, allowing you to add lookup and rollup fields that reference the linked record.`}),`\n`,_jsxs(_components.p,{children:[`However, unlike Postgres, where relations are most commonly 1:many or 1:1 between two tables, in Airtable it’s common to find 1:many, 1:1, `,_jsx(_components.em,{children:`and`}),` many:many relations between tables. `,_jsx(_components.strong,{children:`Right now, Bracket only supports 1:1 and 1:many relations between Airtable and Postgres.`})]}),`\n`,_jsx(Heading,{level:`2`,id:`how-do-i-maintain-my-airtable-relations-in-postgres`,children:`How do I maintain my Airtable relations in Postgres?`}),`\n`,_jsx(_components.p,{children:`To maintain relations between Airtable and Postgres, there are two basic requirements:`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`Parent tables must include the Airtable record ID as a synced field, and this field must have a `,_jsx(_components.code,{children:`unique`}),` constraint enforced in Postgres.`]}),`\n`,_jsx(_components.li,{children:`Children tables must have foreign key constraints on the linked record field, which will reference the Airtable record ID of the parent table`}),`\n`]}),`\n`,_jsxs(Tip,{children:[`To create a record ID field in Airtable, just add a formula field with the formula `,_jsx(_components.code,{children:`=RECORD_ID()`})]}),`\n`,_jsx(Heading,{level:`2`,id:`step-by-step-example`,children:`Step-by-step example`}),`\n`,_jsxs(_components.p,{children:[`Going back to the `,_jsx(_components.code,{children:`customers`}),` and `,_jsx(_components.code,{children:`reservations`}),` example, here’s a step-by-step guide:`]}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`Add a field with the Airtable record ID to the `,_jsx(_components.code,{children:`customers`}),`, and make sure that field syncs to Postgres.`]}),`\n`,_jsxs(_components.li,{children:[`In Postgres, enforce a unique constraint on this record ID field for the `,_jsx(_components.code,{children:`customers`}),` table.`]}),`\n`,_jsxs(_components.li,{children:[`Sync your Airtable data to Postgres for the `,_jsx(_components.code,{children:`customers`}),` table.`]}),`\n`,_jsxs(_components.li,{children:[`In Postgres, in the `,_jsx(_components.code,{children:`reservations`}),` table, add a foreign key constraint on the linked record field in Airtable that references `,_jsx(_components.code,{children:`customers`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`Sync your Airtable data to Postgres for the `,_jsx(_components.code,{children:`reservations`}),` table.`]}),`\n`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Postgres \u003c> Airtable Relations Guide","sidebarTitle":"Postgres \u003c> Airtable guide","description":"How to maintain record relationships between Postgres and Airtable","href":"/guides/foreign_keys"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Summary","slug":"summary","depth":2,"children":[]},{"title":"How does Postgres handle relations?","slug":"how-does-postgres-handle-relations","depth":2,"children":[]},{"title":"How does Airtable handle relations?","slug":"how-does-airtable-handle-relations","depth":2,"children":[]},{"title":"How do I maintain my Airtable relations in Postgres?","slug":"how-do-i-maintain-my-airtable-relations-in-postgres","depth":2,"children":[]},{"title":"Step-by-step example","slug":"step-by-step-example","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"bracket","siteName":"Bracket","title":"Postgres \u003c> Airtable Relations Guide - Bracket","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-01-06T22:37:32.455Z","originalFileLocation":"guides/foreign_keys.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"How to maintain record relationships between Postgres and Airtable\">\u003cmeta data-mint-head name=\"application-name\" content=\"Bracket\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/bracket/di8HbR9wibg0--cB/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/bracket/di8HbR9wibg0--cB/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/bracket/di8HbR9wibg0--cB/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/bracket/di8HbR9wibg0--cB/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/bracket/di8HbR9wibg0--cB/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/bracket/di8HbR9wibg0--cB/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/bracket/di8HbR9wibg0--cB/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/bracket/di8HbR9wibg0--cB/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/bracket/di8HbR9wibg0--cB/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Postgres \u0026lt;\u0026gt; Airtable Relations Guide - Bracket\">\u003cmeta data-mint-head property=\"og:description\" content=\"How to maintain record relationships between Postgres and Airtable\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Bracket\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.usebracket.com/guides/foreign_keys\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://bracket.mintlify.site/_mintlify/api/og/v2?division=Foreign+Keys\u0026amp;title=Postgres+%3C%3E+Airtable+Relations+Guide\u0026amp;description=How+to+maintain+record+relationships+between+Postgres+and+Airtable\u0026amp;theme=2ae0fdf688d36876365309ad\u0026amp;signature=cc74adf689cfa277b8eba5b57463b7216e2f653b86178d3652c67b9badb10b44\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Postgres \u0026lt;\u0026gt; Airtable Relations Guide - Bracket\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"How to maintain record relationships between Postgres and Airtable\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://bracket.mintlify.site/_mintlify/api/og/v2?division=Foreign+Keys\u0026amp;title=Postgres+%3C%3E+Airtable+Relations+Guide\u0026amp;description=How+to+maintain+record+relationships+between+Postgres+and+Airtable\u0026amp;theme=2ae0fdf688d36876365309ad\u0026amp;signature=cc74adf689cfa277b8eba5b57463b7216e2f653b86178d3652c67b9badb10b44\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/bracket/di8HbR9wibg0--cB/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Bracket\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#47689E\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.usebracket.com/guides/foreign_keys\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/guides/foreign_keys.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.usebracket.com/#organization\",\"name\":\"Bracket\",\"url\":\"https://docs.usebracket.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/bracket/bx6DzcifAPUE0Au7/logo/light.svg?fit=max\u0026auto=format\u0026n=bx6DzcifAPUE0Au7\u0026q=85\u0026s=c72851b277e1f0dfa02b8178da42620b\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.usebracket.com#website\",\"name\":\"Bracket\",\"url\":\"https://docs.usebracket.com\",\"publisher\":{\"@id\":\"https://docs.usebracket.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.usebracket.com/guides/foreign_keys#webpage\",\"url\":\"https://docs.usebracket.com/guides/foreign_keys\",\"name\":\"Postgres \\u003c> Airtable Relations Guide\",\"description\":\"How to maintain record relationships between Postgres and Airtable\",\"dateModified\":\"2026-01-06T22:37:32.455Z\",\"isPartOf\":{\"@id\":\"https://docs.usebracket.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.usebracket.com/guides/foreign_keys#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.usebracket.com/guides/foreign_keys#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Guides\",\"item\":\"https://docs.usebracket.com/guides/deletes\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Postgres \\u003c> Airtable Relations Guide\",\"item\":\"https://docs.usebracket.com/guides/foreign_keys\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.usebracket.com/guides/foreign_keys#article\",\"headline\":\"Postgres \\u003c> Airtable Relations Guide\",\"name\":\"Postgres \\u003c> Airtable Relations Guide\",\"description\":\"How to maintain record relationships between Postgres and Airtable\",\"url\":\"https://docs.usebracket.com/guides/foreign_keys\",\"mainEntityOfPage\":{\"@id\":\"https://docs.usebracket.com/guides/foreign_keys#webpage\"},\"dateModified\":\"2026-01-06T22:37:32.455Z\",\"publisher\":{\"@id\":\"https://docs.usebracket.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.usebracket.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Bracket\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Bracket","nav":{"global":null,"anchors":[{"anchor":"Documentation","icon":"book-open","groups":[{"group":"Introduction","pages":[{"title":"What is Bracket?","href":"/introduction"},{"title":"Quick Start","href":"/quickstart"},{"group":"Sync methods","pages":[{"title":"Polling","href":"/polling"},{"title":"Streaming","href":"/streaming"}]}]},{"group":"Guides","pages":[{"title":"Deletes","description":"How Bracket handles deleted records","href":"/guides/deletes"},{"group":"Foreign Keys","pages":[{"title":"Postgres \u003c> Airtable Relations Guide","sidebarTitle":"Postgres \u003c> Airtable guide","href":"/guides/foreign_keys"}]},{"group":"Legacy App","pages":[{"title":"Integrations and Support","sidebarTitle":"Integrations \u0026 support","description":"Integrations supported on the legacy app","href":"/guides/legacy_integrations"},{"title":"Field mapping and field types","sidebarTitle":"Field mapping","href":"/guides/legacy_field_mapping"}]},{"title":"Primary Keys","href":"/guides/pkeys"},{"title":"Runs","href":"/guides/runs"}]},{"group":"Integrations","pages":[{"group":"Airtable","pages":[{"title":"Connecting an existing Airtable base","sidebarTitle":"Connecting","href":"/connecting/airtable_connecting"},{"title":"Airtable primary keys","sidebarTitle":"Primary keys","href":"/connecting/airtable_pkey"}]},{"group":"Notion","pages":[{"title":"Connecting an existing Notion database","sidebarTitle":"Connecting","href":"/connecting/notion_connecting"},{"title":"Notion primary keys","sidebarTitle":"Primary keys","href":"/connecting/notion_pkey"}]},{"group":"DynamoDB","pages":[{"title":"DynamoDB","href":"/connecting/dynamodb_connecting"}]},{"group":"Firestore","pages":[{"title":"Connecting Firestore","sidebarTitle":"Connecting","href":"/connecting/firebase_connecting"},{"title":"Firestore primary keys","sidebarTitle":"Primary keys","href":"/connecting/firebase_pkey"}]},{"group":"Google Sheets","pages":[{"title":"Connecting an existing Google Sheet","sidebarTitle":"Connecting","href":"/connecting/gsheets_connecting"},{"title":"Configuring your Google Sheet primary key","sidebarTitle":"Primary keys","href":"/connecting/gsheets_pkey"}]},{"group":"Hubspot","pages":[{"title":"Connecting Hubspot","sidebarTitle":"Connecting","href":"/connecting/hubspot_connecting"}]},{"group":"MongoDB","pages":[{"title":"Connecting MongoDB","sidebarTitle":"Connecting","href":"/connecting/mongodb_connecting"},{"title":"MongoDB primary keys","sidebarTitle":"Primary keys","href":"/connecting/mongodb_pkey"}]},{"group":"MySQL","pages":[{"title":"Connecting MySQL","sidebarTitle":"Connecting","href":"/connecting/mysql_connecting"}]},{"group":"Postgres","pages":[{"title":"Connecting Postgres","sidebarTitle":"Connecting","href":"/connecting/postgres_connecting"},{"title":"Configuring your Postgres primary key","sidebarTitle":"Primary keys","href":"/connecting/postgres_pkey"},{"title":"Creating Postgres tables using Bracket","sidebarTitle":"Creating a table","href":"/connecting/postgres_creating_table"},{"title":"Using an existing table with Bracket","sidebarTitle":"Using an existing table","href":"/connecting/postgres_self_created_tables"}]},{"group":"Salesforce","pages":[{"title":"Connecting Salesforce","sidebarTitle":"Connecting","href":"/connecting/salesforce_connecting"},{"title":"Salesforce API Reference","sidebarTitle":"API Reference","href":"/connecting/salesforce_api"}]},{"group":"Snowflake","pages":[{"title":"Connecting Snowflake","sidebarTitle":"Connecting","href":"/connecting/snowflake_connecting"},{"title":"Configuring your Snowflake primary key","sidebarTitle":"Primary keys","href":"/connecting/snowflake_pkey"}]}]}]},{"anchor":"Demo","href":"https://www.loom.com/share/6b3b67a2b603454787aed7edad9c64d7?sid=8c111789-449d-425f-9ab1-d54638845d8a","icon":"circle-play","color":{"light":"#db4e5e","dark":"#db4e5e"}},{"anchor":"Contact Us","href":"mailto:founders@usebracket.com","icon":"envelope","color":{"light":"#ffcc4c","dark":"#ffcc4c"}}]},"basePath":"","title":"Postgres \u003c> Airtable Relations Guide - Bracket","buildId":"dpl_DTau1J5HqS9UTgVSDwGksstFWtPa","deploymentId":"dpl_DTau1J5HqS9UTgVSDwGksstFWtPa","dynamics":[],"chunks":[]}