konto usunięte

Temat: Zarządzanie bazą danych a kodowanie

Uszanowanie :)

W jaki sposób projektujecie/zarządzacie bazą danych (mowa głównie o SQL Server) w swoich projektach dotnetowych?

Czy korzystasz z narzędzi wbudowanych w Visual Studio czy raczej z zewnętrznych projektów takich jak Toad Data Modeler (stare CASE Studio), DeZign, ... itp ?

Przykładowo mamy nowy projekt i wraz z rozwijaniem kodu modyfikujemy schemat bazy danych (zmiana nazw tabel, relacji, typów pól, ...) - i chcemy żeby pracowało nam się jak najprzyjemniej bez zbędnego przemęczania się.

Każda opinia, wskazówka będzie nagrodzona wartościową wypowiedzią ;)

konto usunięte

Temat: Zarządzanie bazą danych a kodowanie

Borykam się z podobnym problemem :) Niestety moja firma jest za biedna na Team System więc kultywujemy tradycję manufaktury - generacja skryptów + svn ;)

http://stackoverflow.com/questions/167586/visual-studi...

http://www.codinghorror.com/blog/archives/000743.html

konto usunięte

Temat: Zarządzanie bazą danych a kodowanie

mi najwygodniej pracuje się z bazą danych za pomocą Menagment Studio
Ma w zasadzie wszystko czego potrzebuję do pracy z bazą, jedyna wada to że nie jest to zintegrowane z Visual Studio

konto usunięte

Temat: Zarządzanie bazą danych a kodowanie

Paweł Demus:
W jaki sposób projektujecie/zarządzacie bazą danych (mowa głównie o SQL Server) w swoich projektach dotnetowych?
Bazę rozwijam w tSQLu i tam ją projektuję więc w tej kwestii żadnego narzędzia nie używam.

Natomiast interfejs z softem w .NET robię przez Linq2SQL a dokładnie przez table-valued function - je sobie generuję w graficznym designerze i z nich czytam (zapis przez procedury)
Jeżeli zmieni się schemat bazy danych to już mój problem, aby odpowiednie table-valued function zmodyfikować (with schemabinding jest dobrym przypominaczem).
Table-valued function mają tę zaletę w Linq2SQL, że ciągle można na nich zapuszczać dowolne query - np. paging - który wykona się na SQL Serverze.

W projekcie VS sam DataContext przechowuję jako internal w oddzielnym projekcie z DAL i maksymalnie enkapsuluję - tworzę kolejną warstwę abstrakcji (oddzielne DTO, business objects) tak, aby w przyszłości bez problemu przełączyć się na jakiś inny sposób dostępu do danych.

konto usunięte

Temat: Zarządzanie bazą danych a kodowanie

maciek kański:
Jeżeli zmieni się schemat bazy danych to już mój problem, aby odpowiednie table-valued function zmodyfikować (with schemabinding jest dobrym przypominaczem).
Table-valued function mają tę zaletę w Linq2SQL, że ciągle można na nich zapuszczać dowolne query - np. paging - który wykona się na SQL Serverze.

tego typu gadżet można zrealizować w zasadzie dowolnym zapytaniem dozbrojonym o funkcję ROW_NUMBER()
http://www.databasejournal.com/features/mssql/article....

ale to tak na marginesie

konto usunięte

Temat: Zarządzanie bazą danych a kodowanie

dzięki Jarek za info, właśnie utwierdziłem się w przekonaniu, że Microsoft Visual Studio Team System 2008 Database Edition jest dokładnie tym czego potrzebuję - ogólnie dziwię się, że nie jest to standardowo w VS 2008 Pro, bo ułatwia pracę niesamowicie (albo inaczej nie przedłuża jej niepotrzebnie ;)

z tego co się chwalą to ma jeszcze funkcję do generowania alter skryptów - to jest to co szukałem :)

trochę więcej informacji jak by ktoś był ciekaw:
http://channel9.msdn.com/pdc2008/TL45/

http://www.vitalygorn.com/blog/post/2008/01/Handling-D...
http://www.vitalygorn.com/blog/post/2008/01/How-to-mak...

z Management Studio korzystam aktualnie ale klient zwiększył wymagania i potrzebuję innego rozwiązania - thx

konto usunięte

Temat: Zarządzanie bazą danych a kodowanie

swego rodzaju rozszerzeniem do możliwości menagment studio są DDL triggery. W nich z EVENTDATA można wydłubać kto i co robił, ewentualnie mu tego zabronić tudzież wstawić jakieś dane o tym co i przez kogo zostało zmienione do tabeli

konto usunięte

Temat: Zarządzanie bazą danych a kodowanie

Przemysław R.:
tego typu gadżet można zrealizować w zasadzie dowolnym zapytaniem dozbrojonym o funkcję ROW_NUMBER()
Wszystko da się zrobić w tSQL bo Linq2SQL i tak wszystko na SQLa tłumaczy.
Uwzględnij, że ROW_NUMBER ma pracować po dynamicznej kolumnie. Robiąc w tSQLu miałbyś dynamiczny SQL czyli kupę roboty, którą Linq2SQL robi za nas:
collection.Skip((pageNumber-1) * pageSize).Take(pageSize)
Ponadto dla pierwszej strony Linq2SQL nie korzysta z ROW_NUMBER() tylko z TOP.

I o to chyba chodzi w tych całym mapperach relacyjno-obiektowych, aby skrócić sobie czas kodowania i nie tworzyć ręcznie kodu tSQL z poziomu aplikacji oszczędzając sobie czasu i wykrywać błędy już w czasie kompilacji a nie runtime'u.

konto usunięte

Temat: Zarządzanie bazą danych a kodowanie

Paweł Demus:
dzięki Jarek za info, właśnie utwierdziłem się w przekonaniu, że Microsoft Visual Studio Team System 2008 Database Edition jest dokładnie tym czego potrzebuję - ogólnie dziwię się, że nie jest to standardowo w VS 2008 Pro, bo ułatwia pracę niesamowicie (albo inaczej nie przedłuża jej niepotrzebnie ;)

Ułatwia, ułatwia i dlatego sobie za to liczą 5 razy więcej niż za zwykłe Pro. Zostaje mi tylko obejść się smakiem ;)

P.S. Bardziej niż zarządzanie bazą boli mnie to, że nie można w Pro zainstalować PEX'a.

konto usunięte

Temat: Zarządzanie bazą danych a kodowanie

maciek kański:
Paweł Demus:
W jaki sposób projektujecie/zarządzacie bazą danych (mowa głównie o SQL Server) w swoich projektach dotnetowych?
Bazę rozwijam w tSQLu i tam ją projektuję więc w tej kwestii żadnego narzędzia nie używam.

Natomiast interfejs z softem w .NET robię przez Linq2SQL a dokładnie przez table-valued function - je sobie generuję w graficznym designerze i z nich czytam (zapis przez procedury)

Offtop. Maciek nie wkurza Cię odświeżanie dbmli? Zarządzanie kontekstem (DataLoadOptions!) w aplikacjach wielowątkowych/stateful?
Przy większych obciążeniach niezbędne jest przepisanie kodu na compiled query a to czasami sprawia trudności, jeżeli wcześniej się o tym nie pomyślało. Ja popełniłem taki błąd i później nie było fajnie ;)

konto usunięte

Temat: Zarządzanie bazą danych a kodowanie

maciek kański:
Przemysław R.:
tego typu gadżet można zrealizować w zasadzie dowolnym zapytaniem dozbrojonym o funkcję ROW_NUMBER()
Wszystko da się zrobić w tSQL bo Linq2SQL i tak wszystko na SQLa tłumaczy.
Uwzględnij, że ROW_NUMBER ma pracować po dynamicznej kolumnie. Robiąc w tSQLu miałbyś dynamiczny SQL czyli kupę roboty, którą Linq2SQL robi za nas:
collection.Skip((pageNumber-1) * pageSize).Take(pageSize)
Ponadto dla pierwszej strony Linq2SQL nie korzysta z ROW_NUMBER() tylko z TOP.

I o to chyba chodzi w tych całym mapperach relacyjno-obiektowych, aby skrócić sobie czas kodowania i nie tworzyć ręcznie kodu tSQL z poziomu aplikacji oszczędzając sobie czasu i wykrywać błędy już w czasie kompilacji a nie runtime'u.

taki ORM może wygenerować potworka :)
http://srtsolutions.com/blogs/billwagner/archive/2006/...

umiejętność posługiwania się SQL-em nie jest zła, przynajmniej nie umyka nam wiele niuansów tak jak przy Linq albo innym ORM-ie

konto usunięte

Temat: Zarządzanie bazą danych a kodowanie

Jarek D.:
Offtop. Maciek nie wkurza Cię odświeżanie dbmli? Zarządzanie kontekstem (DataLoadOptions!) w aplikacjach wielowątkowych/stateful?
Do zapisu używam procedur wbudowanych, czyli nie istnieje u mnie coś takiego jak kontekst. Odświeżanie dbmla mnie denerwuje, dlatego raczej zmiany w tSQL w table-valued function wprowadzam tak, aby nie musieć nic regenerować w VS

Przemysław Rachwał:
umiejętność posługiwania się SQL-em nie jest zła, przynajmniej nie umyka > nam wiele niuansów tak jak przy Linq albo innym ORM-ie
Typowa tabelka ma 10 kolum, tabelek w aplikacji może występować wiele. Po każdej kolumnie można filrować oraz sortować, sortowanie dodatkowo w ROW_NUMBER() siedzi. Jeżeli ręcznie budujemy zapytania to wymaga to sporo czasu, a ktoś za ten czas musi płacić. Mapper po prostu odwala za nas mało ambitną i czasochłonną pracę montowania zapytań SELECT, WHERE, ORDER BY. Świadome korzystanie z narzędzi skraca czas developmentu, czyli obniża koszty produkcji softu.

Kontrolować Linq2SQL można przez DataContext.Log albo tradycyjnie przez SQL Profiler. Faktycznie Linq2SQL ma pewne wady zwiazane np. z tym, że nie można kontrolować sposobu w jaki parametryzuje wszelkie stałe z zapytania, ale o tym akurat nie wspomniałeś :)
Gdziekolwiek poważni autorzy piszą o mapperach zawsze podkreślają, aby podglądać kod SQL wyprodukowany przez takie narzędzia więc niewątpliwie korzystanie z mappera nie zwalnia z obowiązku znajomości tSQLa.

konto usunięte

Temat: Zarządzanie bazą danych a kodowanie

maciek kański:
Przemysław Rachwał:
umiejętność posługiwania się SQL-em nie jest zła, przynajmniej nie umyka > nam wiele niuansów tak jak przy Linq albo innym ORM-ie
Typowa tabelka ma 10 kolum, tabelek w aplikacji może występować wiele. Po każdej kolumnie można filrować oraz sortować, sortowanie dodatkowo w ROW_NUMBER() siedzi. Jeżeli ręcznie budujemy zapytania to wymaga to sporo czasu, a ktoś za ten czas musi płacić. Mapper po prostu odwala za nas mało ambitną i czasochłonną pracę montowania zapytań SELECT, WHERE, ORDER BY. Świadome korzystanie z narzędzi skraca czas developmentu, czyli obniża koszty produkcji softu.

Przypomina mi to zasadę trzech Z stosowaną na studiach
zakuć, zaliczyć, zapomnieć
produkt działa, nie ważne że wolno, najwyżej się poprawi w koejnej wersji :)
Co do reszty to się zgadza, jest szybciej
Kontrolować Linq2SQL można przez DataContext.Log albo tradycyjnie przez SQL Profiler. Faktycznie Linq2SQL ma pewne wady zwiazane np. z tym, że nie można kontrolować sposobu w jaki parametryzuje wszelkie stałe z zapytania, ale o tym akurat nie wspomniałeś :)
Gdziekolwiek poważni autorzy piszą o mapperach zawsze podkreślają, aby podglądać kod SQL wyprodukowany przez takie narzędzia więc niewątpliwie korzystanie z mappera nie zwalnia z obowiązku znajomości tSQLa.

Ludzie piszący w Linq często gęsto bladego pojęcia nie mają o SQL i ten stan rzeczy się pogłębia niestety. Więc to co wyprodukuje taki ORM jest raczej jakimś suahili dla takich osób - Ale to oczywiście moje prywatne odczucie

Co do wykorzystania funkcji SQL, nie trzeba z tego korzystać wszędzie, wystarczy że w krytycznych momentach, ale trzeba wiedzieć że są, że można je zastosować i wiedzieć jak, luser klepiący w Linq i średnio znający SQL-a nie ma o tym bladego pojęcia. Bo jak bym zapytał jak pobrać po 5 najnowszych rekordów dla 30 najpopularniejszych kategori a dane idą w miliony rekordów to taki piszący w linq miał by niezły zgryzPrzemysław R. edytował(a) ten post dnia 21.12.09 o godzinie 00:01

konto usunięte

Temat: Zarządzanie bazą danych a kodowanie

Zgadzam się z Przemkiem w 100% odnośnie znajomości SQL.

Ogólnie w moich projektach, staram się nie dopuszczać do pokręconych zapytań z poziomu LINQ.

Jeżeli jest jakiś zestaw danych który wymaga trochę gimnastyki, to zazwyczaj tworzę widok w SQL-u i mapuję ten widok jako tabelę w ORM-ie.

konto usunięte

Temat: Zarządzanie bazą danych a kodowanie

Karim Agha:
Jeżeli jest jakiś zestaw danych który wymaga trochę gimnastyki, to zazwyczaj tworzę widok w SQL-u i mapuję ten widok jako tabelę w ORM-ie.
A w jaki sposób potem sortujesz i filtrujesz ten widok? Ręcznie piszesz statementy w tSQLu czy pozwalasz, aby je maper wygenerował?

konto usunięte

Temat: Zarządzanie bazą danych a kodowanie

Przemysław R.:
taki ORM może wygenerować potworka :)
http://srtsolutions.com/blogs/billwagner/archive/2006/...
Podajesz dość stare informacje, sprzed 3 lat zapewne z bety-wersji. Obecnie każdy może sobie sprawdzić samodzielnie, że tak jak cytujesz się nie dzieje:

using(var dc = new DataClasses1DataContext()) {
dc.Log = Console.Out;
var q = (
from p in dc.Products
orderby p.Size descending
select p)
.Skip(100)
.Take(20)
.OrderBy(p=>p.ProductNumber)
.Select(p=>p.Name)
.ToList();
}

i oto wyprodukowany SQL (dzięki dc.Log = Console.Out):

SELECT [t2].[Name]
FROM (
SELECT [t1].[Name], [t1].[ProductNumber], [t1].[ROW_NUMBER]
FROM (
SELECT ROW_NUMBER() OVER (ORDER BY [t0].[Size] DESC) AS [ROW_NUMBER],
[t0].[Name], [t0].[ProductNumber]
FROM [SalesLT].[Product] AS [t0]
) AS [t1]
WHERE [t1].[ROW_NUMBER] BETWEEN @p0 + 1 AND @p0 + @p1
) AS [t2]
ORDER BY [t2].[ProductNumber], [t2].[ROW_NUMBER]
-- @p0: Input Int (Size = 0; Prec = 0; Scale = 0) [100]
-- @p1: Input Int (Size = 0; Prec = 0; Scale = 0) [20]
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 3.5.30729.1
Input Int (Size = 0; Prec = 0; Scale = 0) [20]

Zwracam uwagę na różne warunki order by.
Od znawców tSQLa chętnie się dowiem, co jest nie tak w w/w kodzie, natomiast od architektów chętnie poznam inną metodę równie szybkiego generowania zapytań.

Jak pisałem polecam:
- korzystać z Linq2SQL bo oszczędza on czas czyli pieniądze czyli łatwiej jest oddać soft w terminie i budżecie
- zawsze kontrolować to co generuje (Linq2SQL, EF i inne) i w razie 'potworków' pokombinować. Ja potworków nie spotkałem ale spotkałem problemy z parametryzacją stałych wyrażeń, które jak widać tylko dla mnie wydają się problemem, wiec pisać nie będę.

Chętnie poznam, jeżeli ktoś miał jakieś negatywne doświadczenia z Linq2SQL wyciągnięte z projektu, z możliwością reprodukcji na dzisiejsze czasy.

konto usunięte

Temat: Zarządzanie bazą danych a kodowanie

maciek kański:

Do zapisu używam procedur wbudowanych, czyli nie istnieje u mnie coś takiego jak kontekst. Odświeżanie dbmla mnie denerwuje, dlatego raczej zmiany w tSQL w table-valued function wprowadzam tak, aby nie musieć nic regenerować w VS

Na co dzień korzystam z LLBLGen'a i ostatnio odkryłem, że ze strony producenta można ściągnąć template'y do L2SQL. Eliminuje to problem odświeżania DBML'a. Po zmianie bazy danych wszystko co muszę zrobić to CTRL+R, F7 :) Odnośnie compiled query:

http://www.davidhayden.com/blog/dave/archive/2008/02/1...

Mimo, że ostatnio L2SQL trochę mnie "poturbował" nadal szczerze podziwiam to co zrobił MS w LINQ providerze w L2SQL. Takich ficzerów reszta producentów ORMów z supportem LINQ może tylko pozazdrościć.

konto usunięte

Temat: Zarządzanie bazą danych a kodowanie

http://oakleafblog.blogspot.com/2007/06/rico-mariani-s...

http://alexpinsker.blogspot.com/2007/07/benchmarking-l...

a co powiecie o tym?
Czy sytuacja się poprawiła jeżeli chodzi o wydajność?

konto usunięte

Temat: Zarządzanie bazą danych a kodowanie

Moje zdanie odnośnie Linq2SQL jest takie, że wiem, iż kod przez niego wygenerowany nie jest najlepszy na świecie. Nie może być bo aby uwzględnić multum przypadków musi czasem robić rzeczy mniej wydajnie. Jednak prędkość jaką daje przy tworzeniu kodu jest znaczna. Powinno się zaczać od Linq2SQL (lub innego ORM'a) i napisać aplikację. Jeśli jakiaś jej część jest zbyt wolna zawsze można ją poprawić używając dedykowanego zapytania SQL. Nie ma sensu probić przedwczesnej optymalizacji i pisania każdego zapytania w SQL bo być może to nie jest kluczowa część naszej aplikacji i tylko stracimy dużo czasu na dopieszczanie superwydajnego zapytania SQL, które wykona się 1 na godzinę.

Zgadzam się jednak, że SQL warto znać (przynajmniej w jakimś podstawowym zakresie).

konto usunięte

Temat: Zarządzanie bazą danych a kodowanie

Przemysław R.:
http://oakleafblog.blogspot.com/2007/06/rico-mariani-s...

http://alexpinsker.blogspot.com/2007/07/benchmarking-l...

a co powiecie o tym?
Czy sytuacja się poprawiła jeżeli chodzi o wydajność?

Po to są właśnie compiled query. W linq większość czasu to tworzenie expression tree. Można tego uniknąć (będzie "liczone" tylko raz) przy użyciu compiled query. Co do wydajności, to nie da się dyskutować z plain T-SQL, ale wykorzystanie ORM'a nie jest podyktowane ekstremalnymi osiągami CRUD, a szybkością developmentu i ceną utrzymania.

Następna dyskusja:

Aplikacja wpf - problem z b...




Wyślij zaproszenie do