Chciałbym w celach treningowych napisać taka aplikacje. Np. niech to będzie serwis samochodowy czy teź gabinet dentystyczny.
Sama aplikacja nie jest jakaś wyszukana - jej pods. funkcjonalność. Chodź o aspekt kont klientów, prezentowania im ich danych, jedna baza. Chciałbym pisać w php stąd wątek tutaj.
Czy hierarchia kont w stylu
Firma
User
UserFirma
Roles
UserRoles
I do KAZDEJ tabeli userId?
No wlasnie strzelam, staram sie pobudzic dyskusje. Kreujesz aplikacje tego warsztatu i dajesz do niej dostep 19 serwisom samochodowym. To jest jedna i ta sama aplikacja. Ewentualnie dajesz kazdemu subdomenę - tutaj tez mam niejasnosc jak to ma chodzic. User_id by wiedziec kto kreuje dany wpis i by prezentowac danemu zakladowi jego dane.
- Rejestracja:ponad 9 lat
- Ostatnio:11 miesięcy
- Postów:1788
Czyli w takim razie chcesz stworzyć aplikacje tzn. multi-tenant
.
http://stackoverflow.com/questions/13325383/multi-tenant-php-saas-separate-dbs-for-each-client-or-group-them
http://www.innomatic.io/
https://www.slideshare.net/InnomaticPlatform/building-multitenant-and-saas-products-in-php-cloudconf-2015
- Rejestracja:ponad 9 lat
- Ostatnio:11 miesięcy
- Postów:1788
Moim zdaniem najlepszym wyjście jest posiadanie bazy per klient. W momencie bootstrapowania aplikacji po subdomenie zaczytujesz odpowiednią bazę.
Wydaje mi się, że posiadanie jednej bazy dla wielu klientów ma dwie głowne wady:
- klient A przez przypadek może zobaczyć dane klienta B. Przy wielu bazach jest mniejsza szansa, bo błąd musiałby być w logice zaczytującej dane do bazy po subdoemenie. Jeżeli masz jedną bazę, to w zapytaniach musisz pilnować warunków
where tenant_id = ...
- performance. Załóżmy, że średnio klient ma 1 000 000 rekordów w jakiejś tabelce, a Ty masz 100 klientów... :)
Jeżeli chodzi o samego laravela, to możesz sobie to zrobić np. tak:
function tenantEnv($key, $default)
{
$url = 'http://tenant.app.com/'; //$_SERVER['host'];
$parsedUrl = parse_url($url);
$host = explode('.', $parsedUrl['host']);
$subdomain = $host[0];
return env(strtoupper($subdomain) . "_" . $key, $default);
}
i w .env
TENANT_DB_DATABASE=homestead
TENANT_DB_USERNAME=homestead
TENANT_DB_PASSWORD=secret
no i oczywiście podmieniasz w pliku config.php
czy tam db.php
juz nie pamiętam, funkcję env()
na tenantEnv
.
Wyjście nr 2, czyli osobny plik .env
, np. .env.tenant
. Możesz do tego użyc $app->loadEnvironmentFrom('.env.tenant');
. Wtedy funkcja env()
będzie uzywała tego pliku, który załadujesz. Nie musisz wtedy modyfikowac configów, ale nie wiem gdzie wrzucić to wywołanie, musisz poszukać.
Desu napisał(a):
Moim zdaniem najlepszym wyjście jest posiadanie bazy per klient. W momencie bootstrapowania aplikacji po subdomenie zaczytujesz odpowiednią bazę.
Wydaje mi się, że posiadanie jednej bazy dla wielu klientów ma dwie głowne wady:
- klient A przez przypadek może zobaczyć dane klienta B. Przy wielu bazach jest mniejsza szansa, bo błąd musiałby być w logice zaczytującej dane do bazy po subdoemenie. Jeżeli masz jedną bazę, to w zapytaniach musisz pilnować warunków
where tenant_id = ...
- performance. Załóżmy, że średnio klient ma 1 000 000 rekordów w jakiejś tabelce, a Ty masz 100 klientów... :)
Jeżeli chodzi o samego laravela, to możesz sobie to zrobić np. tak:
function tenantEnv($key, $default) { $url = 'http://tenant.app.com/'; //$_SERVER['host']; $parsedUrl = parse_url($url); $host = explode('.', $parsedUrl['host']); $subdomain = $host[0]; return env(strtoupper($subdomain) . "_" . $key, $default); }
i w .env
TENANT_DB_DATABASE=homestead TENANT_DB_USERNAME=homestead TENANT_DB_PASSWORD=secret
no i oczywiście podmieniasz w pliku
config.php
czy tamdb.php
juz nie pamiętam, funkcjęenv()
natenantEnv
.Wyjście nr 2, czyli osobny plik
.env
, np..env.tenant
. Możesz do tego użyc$app->loadEnvironmentFrom('.env.tenant');
. Wtedy funkcjaenv()
będzie uzywała tego pliku, który załadujesz. Nie musisz wtedy modyfikowac configów, ale nie wiem gdzie wrzucić to wywołanie, musisz poszukać.
Ma wady ale najczęściej jest stosowana jedna baza i na pewno nie zdobędzie tylu klientów aby było trzeba to dzielić na wiele baz danych.
Ma obciążenie podobne do zwykłego portalu.
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.