Published 3 months ago by CodeSTI
I have a web app that user's can store some data for their projects. Our servers is in the U.S. however I have a customer in Canada, who legally needs to store their data in Canada. So I spun up a new server instance in Canada. My question is what is the best way to handle checking when to pull data from the Canadian server or the US server. I figured it would be best if my eloquent models could set their connection based on the project address (if its Canada use Canada server to pull those models and their relationships).
It's tough for me to visualize how I will do this because of all the relationships. If i want to get all projects and load the relationships, but some data is in US and some in Canada how could I do that?
I'm also wondering if I should have a copy of all my tables on the Canadian server or just the ones that require data to be stored there since only project data needs to be there, but the users table doesn't have to be.
The best way to handle this is replicating the database. This means that both databases are updating each other and keeping everything in sync. However that is more work than you might need.
Why don't you keep all the Canadian data in a database for Canadian clients and do the same for the US. Then you shouldn't have any problems with setting the connection based on the client right?
This way you don't have to keep everything in sync and now you only need to deploy the same code to two different locations, but they each have their own database and data
Would I need to deploy the code to the Canadian database as well? I figured I could just have the database there, but the US server could have the api and just connect to it and pull data from it (I can have the database pass through the US, just not stored here).
So I also store some data that does not need to be in Canada like for example project statuses. There are a bunch and I have a table for these statuses that prefill the dropdowns when creating a project. So the project will have a status_id column. I feel like it would be too redundant to have that table in Canada too, but then when it comes to loading the relationships like that status, I'm wondering how that would even work. Any ideas?
Also thanks for answering so quickly.
Well, you have a database right now because you legally need to store the data in Canada. In that case you also need to store the status in Canada right?
Anyway, as you said only the database would be fine! You can still run your application in the US.
When doing joins in Laravel you might have a hard time to use multiple connections. However normal relationship queries can run their own connection per query. As you might know a relationship, for example a one-to-many` will run two queries. First for the main object, and then for the connected objects. Both queries can run on different connection if the model is configured that way. So in your case it should actually work!
However it might be pretty hard to determine what connection you need to run per table and setting that connection on the table. You might need to end up with running all queries by yourself instead of letting Laravel handle that for you. I have no experience with this! I do have experience with running multiple connections on different databases, but then all the data was in one database so you need to set the connection once for a request!
I would need to store the project's status_id in Canada but not necessarily the statuses table itself since it's a general options list for any project on the app. But I see what you are saying with relationships using two queries, which I did not know so thank you. I really appreciate your help here!