Skip to content
What's new

Link tables, and add up what's linked

  • A Relation column can link to the rows of another table, or of its own: each deal to its company, each budget line to its vendor, each task to the tasks it waits on. A link shows the linked row's name, its first column, always current. Press it to open that table.
  • Also show these links in … adds a column to the other table showing the links from its side. Link or unlink there, and both sides change. A relation made without it can turn it on later. A private table showing its links in a shared one warns that the column will be seen there.
  • Rollup columns add up the rows a relation links to: sum, average, smallest, largest, earliest, latest, count the rows, count the ticked or unique values, or list them. Formulas can read rollups. Totals, charts and the AI's table questions group and filter by a linked row's name, and say when a cell shows only some of its links.
  • People who can't open a linked table see its rows as "Private row", and rollups over it don't show its values. A shared link to a table shows other tables' rows the same way.
  • Limits:
    • a cell links to up to 1,000 rows, and shows 100 with a count of the rest;
    • a rollup adds up to 10,000 linked rows a row, and counts up to 100,000;
    • opening a page of a table reads up to 200,000 links and 50,000 linked rows, the first rows first. Cells past that show how many links they have, and rollups and totals over them say they fall short rather than give a wrong number;
    • a table has up to 50 relations to tables and 100 rollups.
  • Links are kept apart from a row's cells, so saving one cell never changes another's links. They change through POST /tables/{id}/rows/{rowId}/links.
  • API:
    • relation config {"relation_target": "table", "table_id": "…", "two_way": true};
    • a new row's link cell links it to the rows it lists, as ids or [{"id": "<row id>"}]; anything that isn't a row of that table is refused. Updating a row leaves its links as they are, so a row written back as it was read changes none of them. Links change through POST /tables/{id}/rows/{rowId}/links, and through the AI's and MCP's new link_table_rows tool, which changes the links a table's own relations make. A cell reads back with label, type: "row" and table_id, then a type: "more" count of links past those shown;
    • rollup config {"relation", "field", "aggregate"};
    • GET /tables/{id}/fields;
    • GET /tables/{id}/rows/pick?q=;
    • migration 197.

Fixes

  • A table's live updates carry the changed row's id, not the row. Each open grid fetches it again, as its reader may see it. Tables linking to a row that's renamed or deleted show it within seconds.
  • The server vacuums the links between tables as they grow, which Postgres 12 doesn't do for a table that's only added to, so tables with many links stay quick to open.
  • The formula editor's list of functions reads as one you can open (Show functions). It looked like an empty heading.
  • The AI's table tools say what was wrong with a row they couldn't write, so an agent can put it right.
v2.69.0 with AI · v1.54.0 without AI