Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2013-02-18 14:08:29

  Huk - Smoleńsk BULWA!

Huk
Smoleńsk BULWA!
Zarejestrowany: 2006-11-08

C#/C++/Java - dobre praktyki podczas operacji na bazie

Witam.

Tak się zastanawiam, mając taki kod:

Kod:

try
{
    DodajCośDoBazy();
    ZróbCoś()
}

jak najlepiej obronić się przed zostawianiem syfu w bazie? Czy dobrym rozwiązaniem jest wyrzucenie wszystkiego co operuje na bazach na zasadzie:

Kod:

try
{
    var dodane = DodajCośDoBazy();//w samej metodzie nic nie zapisuj;
    ZróbCoś()
    
    baza.DodajObiekt(dodane);
    baza.ZapiszZmiany();
}

Czy jest jakiś lepszy sposób? To powyższe wydaje się jakieś takie "bee". ;]

Offline

 

#2  2013-02-18 14:14:42

  jezoo - Dzięcioł

jezoo
Dzięcioł
Skąd: Z lasu
Zarejestrowany: 2005-09-02

Re: C#/C++/Java - dobre praktyki podczas operacji na bazie

najlepiej zrobić sobie modele bazy (ORM) a nastepnie wykonujesz tylko metode save() np:

Kod:

UserModel user = new UserModel();

user.login = "login";
user.password = "tajne jaslo";
user.email = "stefek@lala.pl";
user.save();

i masz po zamiatany syf :)

a jak sobie dobrze opiszesz model to mozesz wycignac owego usera:

Kod:

UserModel user = UserModel("stefek@lala.pl");
form.name.value = user.name;
form.lastname.value = user.lastname;

no :)

PSy 1:
z reszta jaki model zrobisz to takie metody bedziesz mial, i przez to najlepiej uzywac frameworkow w javie np. hibernate


[img]http://intershock.pl/images/icons/freebsd.jpg[/img] [img]http://www.the-eleven.com/site_media/static/img/postgresql_powered.png[/img] [img]http://www.wwgmc.com/images/badge_php.gif[/img]
LRU #480459

Offline

 

#3  2013-02-18 15:08:51

  Huk - Smoleńsk BULWA!

Huk
Smoleńsk BULWA!
Zarejestrowany: 2006-11-08

Re: C#/C++/Java - dobre praktyki podczas operacji na bazie

@jezoo:

Model oczywiście jest - jako że obecnie robię na C# to jest generowany za pomocą EntityToSql. Tyle że pytanie jest czy lepiej wszelkie metody dodające coś do modelu tworzyć tak aby realnie same w sobie nie modyfikowały bazy, np:

Kod:

public DataModel InsertData()
{
    DataModel dataModel = new DataModel();
    
    return dataModel;
}

I potem w kodzie używać w stylu:

Kod:

try
{
    var dataModel = InsertData();
    
    database.InsertData(dataModel);
    database.SaveChanges();//W przypadku Entity dopiero tutaj dane lądują w bazie
}

Plusem powyższego wydaje się być fakt że w przypadku wyjątku żadne syfy nie powinny wpaść do bazy (o ile dobrze patrzę ;] ). Tyle że wydaje mi się że powyższa konstrukcja jest trochę "bee" z punktu widzenia estetyki. Stad pytanie czy jest na to jakiś lepszy wzorzec :)

Offline

 

#4  2013-02-18 18:49:28

  kamikaze - Administrator

kamikaze
Administrator
Zarejestrowany: 2004-04-16

Re: C#/C++/Java - dobre praktyki podczas operacji na bazie

Troche lekturki http://pl.wikipedia.org/wiki/Data_Access_Object , poszukaj na google "wzorce dostępu do danych". Poczytaj cokolwiek, sie skupiasz na jakiejś estetyce kilku linijek, które niewiele mówią. Po co jakieś insertData, które robi new DataModel(), to nie lepiej var dataModel = new DataModel() od razu? I nazwa metody kiepsko dobrana, ta metoda ma wsadzać dane? Gdzie? Do DataModel? A potem jakiś obiekt database który też ma inserData? ;] Co robi insertData z database skoro dopiero save changes zapisuje, czyli robi insert data? To jakiaś pseudo obsługa transakcji? Serio byś coś poczytał, a nie filozofujesz na oślep ;] I jak C# to nie pisz, że Java czy C++. Poczytaj czego w C# ludzie używają do utrwalania. Jak chcesz prostą aplikacje to pewnie zwykłe wywoływanie zapytań wystarczy z obsługą błędów i być może transakcje jak potrzebujesz. Jak coś ciekawszego to jakiś ORM, może NHibernate w takim razie.

Offline

 

#5  2013-02-21 09:14:16

  jezoo - Dzięcioł

jezoo
Dzięcioł
Skąd: Z lasu
Zarejestrowany: 2005-09-02

Re: C#/C++/Java - dobre praktyki podczas operacji na bazie

@kamikaze, czym różni się NHibernate od Hibernate ? :)


[img]http://intershock.pl/images/icons/freebsd.jpg[/img] [img]http://www.the-eleven.com/site_media/static/img/postgresql_powered.png[/img] [img]http://www.wwgmc.com/images/badge_php.gif[/img]
LRU #480459

Offline

 

#6  2013-02-21 09:41:26

  0dd - Członek DUG

0dd
Członek DUG
Skąd: Kraków
Zarejestrowany: 2006-03-25

Re: C#/C++/Java - dobre praktyki podczas operacji na bazie

NHibernate jest dla C# a Hibernate dla Javy
Jeśli korzystasz z hibernate to polecam spiąć go razem ze Spring Framework :)
Dobrze jest też korzystać z transakcji przy operacjach na bazie.


apt-get install anarchism

Offline

 

#7  2013-02-22 19:25:55

  czadman - Bicycle repairman

czadman
Bicycle repairman
Skąd: Wrocław
Zarejestrowany: 2005-07-08

Re: C#/C++/Java - dobre praktyki podczas operacji na bazie

[quote=Huk]jak najlepiej obronić się przed zostawianiem syfu w bazie? Czy dobrym rozwiązaniem jest wyrzucenie wszystkiego co operuje na bazach na zasadzie:

Kod:

try
{
    var dodane = DodajCośDoBazy();//w samej metodzie nic nie zapisuj;
    ZróbCoś()
    
    baza.DodajObiekt(dodane);
    baza.ZapiszZmiany();
}

Czy jest jakiś lepszy sposób? To powyższe wydaje się jakieś takie "bee". ;][/quote]
Najlepszy sposób to sprawdzenie poprawności danych przez próbą zapisu, najlepiej w warstwie interfejsu, bo tam się wprowadza dane. Interfejs, który pozwala wpisać dane niezgodne ze schematem jest zły. Każdy dobry ORM też sprawdza zgodność danych ze schematem przed dostępem do bazy, a poleganie na silniku bazy w celu sprawdzania czy nie będzie bałaganu jest nieeleganckie i obciąża niepotrzebnie bazę. Natomiast wyjątkami lepiej się posługiwać przy usuwaniu danych. Kiedy jest dużo danych w bazie to szybciej będzie wyłapać wyjątek wygenerowany przez dobrze zaprojektowany schemat (więzy integralności) niż sprawdzanie w X tabelach czy jakieś dane są używane.

Transakcje także są dobre, ale jak ze wszystkim [url=http://msdn.microsoft.com/en-us/library/ff647793.aspx#scalenetchapt14%20_topic9]powinno się przy ich stosowaniu przestrzegać pewnych reguł[/url].


[url=http://www.debian.org/][img]http://www.debian.org/logos/openlogo-nd-50.png[/img][/url]

Offline

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
To nie jest tylko forum, to nasza mała ojczyzna ;-)

[ Generated in 0.013 seconds, 11 queries executed ]

Informacje debugowania

Time (s) Query
0.00018 SET CHARSET latin2
0.00008 SET NAMES latin2
0.00138 SELECT u.*, g.*, o.logged FROM punbb_users AS u INNER JOIN punbb_groups AS g ON u.group_id=g.g_id LEFT JOIN punbb_online AS o ON o.ident='3.145.103.169' WHERE u.id=1
0.00091 REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '3.145.103.169', 1732248074)
0.00085 SELECT * FROM punbb_online WHERE logged<1732247774
0.00093 SELECT topic_id FROM punbb_posts WHERE id=225161
0.00197 SELECT id FROM punbb_posts WHERE topic_id=22984 ORDER BY posted
0.00084 SELECT t.subject, t.closed, t.num_replies, t.sticky, f.id AS forum_id, f.forum_name, f.moderators, fp.post_replies, 0 FROM punbb_topics AS t INNER JOIN punbb_forums AS f ON f.id=t.forum_id LEFT JOIN punbb_forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=3) WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id=22984 AND t.moved_to IS NULL
0.00008 SELECT search_for, replace_with FROM punbb_censoring
0.00132 SELECT u.email, u.title, u.url, u.location, u.use_avatar, u.signature, u.email_setting, u.num_posts, u.registered, u.admin_note, p.id, p.poster AS username, p.poster_id, p.poster_ip, p.poster_email, p.message, p.hide_smilies, p.posted, p.edited, p.edited_by, g.g_id, g.g_user_title, o.user_id AS is_online FROM punbb_posts AS p INNER JOIN punbb_users AS u ON u.id=p.poster_id INNER JOIN punbb_groups AS g ON g.g_id=u.group_id LEFT JOIN punbb_online AS o ON (o.user_id=u.id AND o.user_id!=1 AND o.idle=0) WHERE p.topic_id=22984 ORDER BY p.id LIMIT 0,25
0.00126 UPDATE punbb_topics SET num_views=num_views+1 WHERE id=22984
Total query time: 0.0098 s