• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Przypisać dany obiekt pod użytkownika czy wykonać relacje.

0 głosów
40 wizyt
pytanie zadane 15 lutego w SQL, bazy danych przez Greeenone Stary wyjadacz (12,190 p.)

Hej,

Mam pewien problem z utworzeniem struktury bazy danych. Nie wiem które z rozwiązań jest poprawne.

Krótki opis:

- Szef tworzy miasta do których przypisuje sklepy. Szef ma dostęp do wszystkiego. Może od do każdego miasta przypisać menadżera któremu pojawią się wszystkie sklepy w danym mieście. Może on także przypisać pracownika do jednego sklepu wtedy ten będzie miał dostęp do niego.

I tutaj pytanie. Dla sklepu lepiej przypisać id szefa czy dać wpis w tabeli dostęp? (Jako, że ma dostęp do wszystkiego to wydaje mi się, że bez sensu jest mnożenie wpisów z dostępami)

Dodatkowe wpisy jak np. id szefa u pracowników jest po to, aby łatwiej było wyszukać i wyświetlić dane. Np. zamiast wyszukać wszystkie miasta przypisane do szefa a następnie wyciągać wszystkich pracowników, po prostu wyszukać po ID szefa.

Druga sprawa:

Gdy zabierany jest dostęp dla użytkownika to lepiej usunąć tabelę czy dać zmienną boolean które będzie sprawdzać, czy użytkownik ma dostęp ?

 

1 odpowiedź

0 głosów
odpowiedź 15 lutego przez Asertywny Gaduła (4,020 p.)
wybrane 15 lutego przez Greeenone
 
Najlepsza

Parę uwag:

  • czy_jest_menadżerem jako pole w bazie wydaje się nie mieć sensu. Może się okazać, że w niedługim czasie będą potrzebne inne typy pracowników. Dlatego lepiej zrobić kolejny foreign key w stylu "typ". Jeśli jakiś pracownik może mieć więcej niż jeden "typ", wtedy będziesz potrzebował tabeli łączącej o schemacie (pracownik: FK, typ: FK) z możliwymi wieloma wpisami.
  • Skoro każde miasto ma jednego szefa, po co przechowujesz informację o szefie w tabeli pracowników? Miasto wystarczy.
  • Mógłbyś dokładniej wytłumaczyć, do czego służy tabela dostęp?

Najbardziej sensownym rozwiązaniem wydaje się dostawić FK w postaci miasta do każdego sklepu. Z tego, można jednoznacznie wyznaczyć szefa poprzez odpowiednie joinowanie.

Inna sprawa - skąd wiesz, który pracownik pracuje w którym sklepie?

komentarz 15 lutego przez Greeenone Stary wyjadacz (12,190 p.)

Dzięki za odpowiedź ! 

Już tłumaczę :P

A więc tak:

Główny szef ma dostęp do globalnej listy miast, sklepów oraz pracowników.

Owy szef może dodać pracownika a następnie mianować go na menadżera miasta lub miast. Chcę zrobić tak, żeby inny szef który zarządza w ogóle czym innym mógł także mianować danego użytkownka na menadżera u siebie.

Menadżer ma listę wszystkich sklepów przypisanych do swojego miasta oraz pracowników. Może ich usuwać albo dodawać

Każdy pracownik ma dostęp do sklepów które zostały mu przydzielone przez szefa lub menadżera (Może mieć też dostęp u zupełnie kogo innego)

Odpowiadając na twoje pytania:

- Co do menadżera, to dziękuje za podpowiedź. Nie pomyślałem o tym.

- Szef i miasto: Przechowuję aby łatwiej było wyszukać wszystkich pracowników po id szefa niż na przykład szukając po sklepach, miastach itp. tworząc kolejne zapytanie. Wyniki by się dublowały itp. Chyba, że można to rozwiązać jakoś inaczej

Tabela dostęp służy do weryfikacji czy dany użytkownik może modyfikować dany sklep.

Tak w ogóle delikatnie zmodyfikowałem strukturę:

komentarz 15 lutego przez Asertywny Gaduła (4,020 p.)
Shop:
shop_id (PK)
city_id (FK)
owner_id (FK)

City:
city_id (PK)
name

Worker:
worker_id (PK)
first_name
last_name
etc

Owner:

owner_id (PK)
first_name
last_name
etc

Shop_Worker (tabela, która mówi, kto jest zatrudniony w którym sklepie)
worker_id (fk)
shop_id (fk)

CityAccess:

user_id (fk)
city_id (fk)

ShopAccess:

user_id(fk)
city_id(fk)

 

Ja to tak widzę. Prosto i bez redundancji.
komentarz 15 lutego przez Greeenone Stary wyjadacz (12,190 p.)
Dziękuje !

Jeszcze tylko jedne pytanie. Teraz jak szef będzie chciał zobaczyć wszystkich swoich pracowników, to muszę wyszukać tak:

- Pobrać listę sklepów przypisanych do Ownera

- Z tych tabel pobrać ID sklepów

- W Shop_worker pobrać ID wszystkich userów przypisanych do danych sklepów

- W tabeli user pobrać dane z każdego pobranego ID ?

+ do tego usunąć duplikaty (Gdy użytkownik jest zatrudniony w dwóch sklepach)
komentarz 15 lutego przez Asertywny Gaduła (4,020 p.)
Tak.
W praktyce można to zrobić w jednym zapytaniu przy użyciu JOINów.

Podobne pytania

0 głosów
1 odpowiedź 88 wizyt
0 głosów
1 odpowiedź 86 wizyt
pytanie zadane 18 grudnia 2018 w SQL, bazy danych przez lewy Obywatel (1,260 p.)
0 głosów
1 odpowiedź 39 wizyt
pytanie zadane 9 lipca w PHP, Symfony, Zend przez mi-20 Stary wyjadacz (10,360 p.)
Porady nie od parady
Wynikowy wygląd pytania, odpowiedzi czy komentarza, różni się od tego zaprezentowanego w edytorze postów. Stosuj więc funkcję Podgląd posta znajdującą się pod edytorem, aby upewnić się, czy na pewno ostateczny rezultat ci odpowiada.Podgląd posta

64,925 zapytań

111,393 odpowiedzi

234,427 komentarzy

46,754 pasjonatów

Przeglądających: 243
Pasjonatów: 15 Gości: 228

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...