Been there too …
If LightSwitch follows MVVM model, you could say that Bubble follows MVW
Anyhow, if you look for the Model part, you can find it under the Data tab. Similarities with LS are in the fact that with Bubble you can pretend that there are no primary keys, everything is done automagically, like in LS which has Entity Framework behind the scenes. If you need to make a many-to-one relationship to another table, you just proclaim one of the fields to be of a corresponding “entity type” that you already defined (entity type is called data type in Bubble). This is a foreign key, but you access it in expressions as Order’s Customer, for instance. Normally, you don’t bother with primary keys in Bubble, but you can use them if needed.
If you go in the opposite, one-to-many direction, one possibility is to proclaim a field to be a list of things (records in tables are “things”). For instance, you can have Customer’s Orders (in this case Orders is a field in Customer data type). However, in LS the collection of things actually leads to corresponding records in another table, in Bubble the IDs of things are physically saved as a list (a kind of array) within the Customer record. And this list has to be “manually” filled when you store the data in tables. This is usually done by workflow actions. These lists within fields are for now limited to 10.000 IDs.
If you don’t create this kind of fields as lists, you can still acces the relating records with the expressions like Search for Orders, setting the search condition to Customer = This group’s Customer, for instance (group is a container for widgets, see bellow).
Bubble doesn’t make a difference between 0…1 - n and 1 - n, and you also have to delete related records, if this is necessary.
In Bubble you deal with View quite a lot, and it is quite reach in comparisson to pure LS. Basically you have containers (page, group, popup …) for other widgets (text, input, check box …), and you can assign a data type to it. Then, a thing of this data type can be searched for (in design time you use expression) or sent to this group (in run time with workflow actions, like Element Actions | Display data), and widgets within it can relate to its corresponding fields with expressions like This group’s Customer’s Name.
There is a special group called Repeating group which can hold a list of things, in this way you can show related records in one-to-many direction, or a list. Containers can be deeply nested.
Thus, with container/widget expressions you have a sort of a ModelView. A powerful possibility is widgets’ Conditional tab, where you can set their properties including data expressions conditionally.
You can also find a sort of a Controller part in Bubble, which is mostly in workflows, a kind of event-driven flow of actions.
Besides all that, you get also a decent user management system, with security which is data-oriented and you can find it under Data | Privacy. This is a must for a production application. Besides that, you can also condition the user interface on authenticated user.
Behind the scenes a separation to server and client “modules” can be seen, but bubble developer is usually spared from that. My only concern related to that was the data access; search expressions are being optimized, but if you do a lot of nested searches then a page can become really slow.
At a first glance, Bubble has simplistic approach and you might think that nothing much can be build with it (considering a relatively small number of workflow actions and expression “functions”), but in fact you might be surprised how powerful it is.
Unfortunatelly, you cannot “import” anything directly from LS. The data migration can be done, but if you have a lot of tables and relationships, it can be cumbersome.