Aktualizacja/wstawianie danych w wielu tabelach - procedura ?

0

Witam,
chciałbym się Was poradzić w jaki sposób powinna przebiegach akutalizacja/wstawianie danych umieszczonych w wielu tabelach ?

Mamy przykładowo: Dodając nowego sędziego (tabela sedzia) jednocześnie powinien być dodany rekord w tabeli osoba.. Osobiście myślałem o wykonaniu tego za pomocą procedury (coś takiego jak ta poniżej), jednak spotkałem się z opiniami: " po co robisz to w procedurze.. To jest niepotrzebne..".

Ok, tylko z takiej odpowiedzi nic nie wynika, dlatego chciałbym zadać pytanie dlaczego jest mało porządane rozwiązanie (może mała wydajność / przekombinowane ? ) i jak lepiej to wykonać ? (normalnie np. w Cpp/Qt wywołać iteracyjnie (po kolei) dwa zapytania SQL )

CREATE PROCEDURE wstawSędziego(
  IN user VARCHAR(50), IN pass CHAR(40), IN fName VARCHAR(50), IN lName VARCHAR(50), IN address VARCHAR(50), IN city VARCHAR(50), IN pesel CHAR(11), IN licence VARCHAR(50))
BEGIN
    DECLARE myvar INT(50);
    SET @paramA = user;
    SET @paramB = pass;
    SET @paramC = fName;
    SET @paramD = lName;
    SET @paramE = address;
    SET @paramF = city;
    SET @paramG = pesel;
    SET @paramH = license;

START TRANSACTION;
   SET @sql = CONCAT('INSERT INTO osoba(firstName, lastName, address, city, pesel) VALUES (?,?,?,?,?)');
   PREPARE s1 FROM @sql;
   EXECUTE s1 USING @paramC, @paramD, @paramE, @paramF, @paramG;

   SELECT LAST_INSERT_ID() INTO myvar FROM persons WHERE pesel=@paramG LIMIT 1;
   SET @osoba_id = myvar;

   SET @sql = CONCAT('INSERT INTO sedzia(license, osoba_id) VALUES (?,?,?)');
   PREPARE s1 from @sql;
   EXECUTE s1 USING @paramA, @osoba_id;
COMMIT;
END//
0

zauważ, że robiąc to po stronie aplikacji musisz wysłać do bazy zapytanie trzy razy. Robiąc to po stronie bazy (stored proc) zapytanie wysyłasz raz. Niby mała różnica ale jak masz dużo takich operacji to już ją można odczuć

0

Co do rozwiązania to zależy co Ci bardziej pasuje. Procedura w bazie niby zmniejsza ruch ale powoduje, że logika aplikacji rozdziela się między kod C++ a bazę danych. Pytanie czy idziesz w logikę w bazie czy w kodzie? Jeśli dodawanie sędziów zrobisz procedurą a inne rzeczy z kodu to istnieje niespójność - trzeba będzie pamiętać co w jaki sposób się robi. Ogólnie czytając na ten temat w Internecie mam wrażenie, że właśnie odchodzi się od podejścia aby trzymać logikę w bazie danych. Oczywiście to nie znaczy, że nie wolno czy nie powinno się tworzyć procedur - moim zdaniem przy trywialnych sprawach(insert do 2 tabel) nie warto strzelać z armaty.

Wracając do meritum sprawy. Ja bym to zrobił po stronie aplikacji bez używania procedur. Dlaczego? Może w pewnym momencie być potrzeba rozbudowy jednej z tabel albo ustawienia wartości dla dodatkowego pola - spowoduje to konieczność modyfikacji bazy danych(procedury) oraz modyfikacji kodu w C++ a to z powodu trywialnego dodawania sędziego.

1 użytkowników online, w tym zalogowanych: 0, gości: 1