Building a website containing restaurant menus from multiple vendors -- need some advice on Section hierarchy of data
Ok, just spitballing here, but this is where my brain is going...



Channel: Restaurants

Each restaurant is a unique entity, correct? So they wouldn't need to be in any specific order, nor nested. (Chain restaurants could be related by other means.) All of your broad restaurant-based fields would be here, including location, phone number, hours of operation, etc.

Channel: Menu

I feel the menu should be a separate channel from the parent restaurants for a couple of reasons:


Seasonal/specialty menus: One restaurant, many menus.
Chain restaurants would share a menu: Many restaurants, one menu.


Within your Restaurants channel, create an Entries field (with a limit of 1) called "Menu". So each restaurant could select its current menu.

Matrix: Menu Items

Within your Menu channel, you'd have a Menu Options matrix field. Each menu option would be its own matrix block.

If you want to use the built-in category system, you may be able to create Category Groups based on different restaurant genres (Mexican, Thai, etc). You could then simply use those very broadly. However, I'd be concerned that those broad categories don't properly address the needs of each individual restaurant.

Alternatively, you may end up needing to create faux categories... I'm not sure you could get the normal category system to work for you here. There would be such wide-ranging variations between the categories of different restaurants, it would be a nightmare to keep up with that using the standard categorization options.

Faux Categories

You could potentially create a dropdown menu to represent your "categories" for a particular restaurant. That faux categories menu could be driven by the amazingly powerful LJ Dynamic Fields plugin. Might take a little trial &amp; error, but that plugin will allow you to build a dropdown menu to be exactly as you need it.

With this method, you could allow each Menu to have its own definition of categories. Create a table field called "Categories" in your Menu section, and allow LJ Dynamic Fields to take advantage of that.

eCommerce Options

I can see why you'd gravitate towards making each menu item into its own entry, but I don't believe that's necessary. Take a look at some of the more generic, non-Craft options for building your checkout process. Specifically Snipcart and Foxycart allow you to render a product however you want to, and don't restrict your back-end data to any particular architecture.

My instinct is telling me that your menu options would be much better suited as a matrix field (or even table field), rather than being their own entries.



Hope that helps, even if it just gives you some new ideas to kick around! :)