Restaurant Ordering and POS ER diagram and database schema
The Restaurant Ordering and POS database schema is a DB Planner template with 29 tables, 220 columns and 60 relationships, free to use. Core tables include adjustment_reasons, business_days, cash_drawers, check_adjustments. It can be opened as an interactive ER diagram or exported as PostgreSQL, MySQL, or SQL Server DDL.
- Tables
- 29
- Columns
- 220
- Relationships
- 60
- Category
- E-commerce
- Exports
- DBML, SQL, C#
- Price
- Free
What this schema models
A complete restaurant point-of-sale database design, built the way a real front of house and kitchen run a shift: 29 tables, 14 enums and 60 relationships covering locations and the floor plan, a menu with dayparts, daypart pricing and modifier groups, recipes and plate cost, staff, role permissions and the time clock, checks by order type with seats and courses, voids, comps and discounts, kitchen tickets routed to prep stations, split payments and tips, cash drawers and the end-of-day close. THE FOUR DESIGN RULES 1. Nothing is deleted. Voids, comps and discounts are append-only adjustment rows with a reason picked from a fixed list, the employee who asked and the manager who approved. A check line that reached the kitchen is never deleted: a void marks it voided, and a void after firing is flagged as food waste. 2. Check lines are snapshots with a seat and a course. The name and the price actually charged (including a happy-hour daypart price and the modifier deltas) are copied at ring-in. The seat number drives serving and split-by-seat; the course decides firing order, and a line stays held until its course is fired. 3. The kitchen sees tickets, not checks. Firing a course creates one ticket per prep station, each with its own fired, started, bumped and recalled times, so ticket time is measured per station. A void after firing reaches the station as a void notice instead of silently vanishing from the screen. 4. Business date, not calendar date. Checks, payments, time punches and drawer sessions all belong to a business day that rolls over at an hour set per location, so the 1:30 am bar tab lands on the right night. The end-of-day close freezes the totals and locks the day. DETAILS WORTH STEALING - Cash drawers use blind counts: the closer counts without seeing the expected amount, over/short is stored per session, and a partial unique index allows one open session per drawer. - Every safe drop, paid-out, paid-in and no-sale opening is a drawer movement, which is exactly what managers audit. - Splitting a check evenly, by seat or by amount is just several payment rows, and card tips are added at tip adjust after the swipe. - Permissions hang off roles through a join table, PINs are stored only as hashes, and every check, void, comp and payment records the employee. - Time clock punches snapshot the wage, record declared cash tips and any manager correction, and only one open punch per employee is allowed. - Recipe lines link ingredients to items and to modifiers such as "Add bacon", which gives plate cost and theoretical usage per day. WHAT YOU GET Clean DBML that imports directly into DB Planner, and a laid-out board with zones color-coded and framed: recipes and food cost, menu, locations and floor plan, checks and adjustments, kitchen display, payments, cash and day close, and staff and permissions. Every table carries a note. Postgres-flavoured types that port cleanly to MySQL or SQL Server. Useful for developers building a restaurant POS, ordering or kitchen display system, and for students who need a realistic restaurant POS ER diagram for a DBMS project. This is a schema design reference; tax, tip and labor rules vary by jurisdiction and belong in your own business logic.
Tables (29)
| Table | Columns |
|---|---|
| adjustment_reasons | 8 |
| business_days | 11 |
| cash_drawers | 4 |
| check_adjustments | 11 |
| check_item_modifiers | 5 |
| check_items | 13 |
| checks | 18 |
| dayparts | 6 |
| dining_areas | 4 |
| dining_tables | 8 |
| drawer_movements | 8 |
| drawer_sessions | 11 |
| employees | 9 |
| ingredients | 6 |
| item_daypart_prices | 3 |
| kitchen_ticket_items | 4 |
| kitchen_tickets | 11 |
| locations | 9 |
| menu_categories | 6 |
| menu_item_modifier_groups | 3 |
| menu_items | 10 |
| modifier_groups | 5 |
| modifier_options | 5 |
| payments | 14 |
| prep_stations | 6 |
| recipe_lines | 5 |
| role_permissions | 2 |
| roles | 4 |
| time_clock_entries | 11 |
Relationships (60)
adjustment_reasons.location_id references locations.idmany to onebusiness_days.closed_by references employees.idmany to onebusiness_days.location_id references locations.idmany to onecash_drawers.location_id references locations.idmany to onecheck_adjustments.adjustment_reason_id references adjustment_reasons.idmany to onecheck_adjustments.approved_by references employees.idmany to onecheck_adjustments.check_id references checks.idmany to onecheck_adjustments.check_item_id references check_items.idmany to onecheck_adjustments.requested_by references employees.idmany to onecheck_item_modifiers.check_item_id references check_items.idmany to onecheck_item_modifiers.modifier_option_id references modifier_options.idmany to onecheck_items.check_id references checks.idmany to onecheck_items.menu_item_id references menu_items.idmany to onecheck_items.rung_in_by references employees.idmany to onechecks.business_day_id references business_days.idmany to onechecks.dining_table_id references dining_tables.idmany to onechecks.location_id references locations.idmany to onechecks.server_id references employees.idmany to onechecks.split_from_check_id references checks.idmany to onedayparts.location_id references locations.idmany to onedining_areas.location_id references locations.idmany to onedining_tables.dining_area_id references dining_areas.idmany to onedrawer_movements.approved_by references employees.idmany to onedrawer_movements.drawer_session_id references drawer_sessions.idmany to onedrawer_movements.employee_id references employees.idmany to onedrawer_sessions.business_day_id references business_days.idmany to onedrawer_sessions.cash_drawer_id references cash_drawers.idmany to onedrawer_sessions.employee_id references employees.idmany to onedrawer_sessions.verified_by references employees.idmany to oneemployees.location_id references locations.idmany to oneemployees.role_id references roles.idmany to oneingredients.location_id references locations.idmany to oneitem_daypart_prices.daypart_id references dayparts.idmany to oneitem_daypart_prices.menu_item_id references menu_items.idmany to onekitchen_ticket_items.check_item_id references check_items.idmany to onekitchen_ticket_items.kitchen_ticket_id references kitchen_tickets.idmany to onekitchen_tickets.check_id references checks.idmany to onekitchen_tickets.fired_by references employees.idmany to onekitchen_tickets.prep_station_id references prep_stations.idmany to onemenu_categories.daypart_id references dayparts.idmany to onemenu_categories.location_id references locations.idmany to onemenu_item_modifier_groups.menu_item_id references menu_items.idmany to onemenu_item_modifier_groups.modifier_group_id references modifier_groups.idmany to onemenu_items.menu_category_id references menu_categories.idmany to onemenu_items.prep_station_id references prep_stations.idmany to onemodifier_groups.location_id references locations.idmany to onemodifier_options.modifier_group_id references modifier_groups.idmany to onepayments.business_day_id references business_days.idmany to onepayments.check_id references checks.idmany to onepayments.drawer_session_id references drawer_sessions.idmany to onepayments.employee_id references employees.idmany to oneprep_stations.location_id references locations.idmany to onerecipe_lines.ingredient_id references ingredients.idmany to onerecipe_lines.menu_item_id references menu_items.idmany to onerecipe_lines.modifier_option_id references modifier_options.idmany to onerole_permissions.role_id references roles.idmany to onetime_clock_entries.business_day_id references business_days.idmany to onetime_clock_entries.edited_by references employees.idmany to onetime_clock_entries.employee_id references employees.idmany to onetime_clock_entries.role_id references roles.idmany to one
How to use this template
- Open the ER diagram to see the tables and how they relate.
- Copy it into your workspace. You get your own editable copy, in DBML.
- Export it as PostgreSQL, MySQL, or SQL Server DDL, or as C# models.
The copy opens in DB Planner’s ER diagram tool, with the schema as text in the DBML editor beside it. Have a database already? Turn its SQL into an ER diagram instead.
Frequently asked questions
- What is in the Restaurant Ordering and POS database schema?
- 29 tables and 60 relationships, across 220 columns. The table names and the full relationship list are shown on this page.
- Can I export it to PostgreSQL or MySQL?
- Yes. Every DB Planner template exports as DBML, as PostgreSQL, MySQL, or SQL Server DDL, and as C# models.
- Is this template free?
- Yes. You can open it in the browser without an account, and copy it into your own workspace with a free DB Planner account.
- Can I change it after copying it?
- Yes. A copy is yours: you can rename tables, add columns, and export it. Changes the author makes later do not affect your copy.