Jakie są dobre schematy SQL Server?

185

Nie jestem początkującym w korzystaniu z baz danych SQL, aw szczególności z SQL Server. Jednak przede wszystkim byłem facetem SQL 2000 i zawsze byłem zdezorientowany przez schematy w 2005+. Tak, znam podstawową definicję schematu, ale do czego są one naprawdę używane w typowym wdrożeniu programu SQL Server?

Zawsze używałem domyślnego schematu. Dlaczego miałbym chcieć tworzyć specjalistyczne schematy? Dlaczego miałbym przypisywać którykolwiek z wbudowanych schematów?

EDYCJA: Aby to wyjaśnić, chyba szukam korzyści ze schematów. Jeśli zamierzasz używać go tylko jako schematu bezpieczeństwa, wygląda na to, że role bazy danych już wypełniały tę ... eee ... um ... rolę. Używanie go jako specyfikatora przestrzeni nazw wydaje się być czymś, co można zrobić z własnością (dbo kontra użytkownik itp.).

Chyba chodzi mi o to, co robią schematy, których nie można zrobić z właścicielami i rolami? Jakie są ich szczególne korzyści?

Erik Funkenbusch
źródło

Odpowiedzi:

164

Schematy logicznie grupują tabele, procedury, widoki razem. Wszystkie obiekty związane z pracownikami w employeeschemacie itp.

Możesz także nadać uprawnienia tylko jednemu schematowi, aby użytkownicy widzieli tylko schemat, do którego mają dostęp, i nic więcej.

SQLMenace
źródło
21
Możliwość przypisania uprawnień do schematu sprawia, że ​​warto z administracyjnego punktu widzenia.
Hakan Winther
9
Nie możesz użyć oddzielnej bazy danych?
sam yi
7
Ten schemat zezwalania brzmi dobrze na papierze ... ale rzadko kiedy jest używany właściwie. Dla mnie to nie jest warte kłopotów.
sam yi
3
Ale jeśli tak jest, czy nie można osiągnąć tego samego przy użyciu konwencji nazewnictwa? Nie sugeruję, aby NIE było w tym przypadku użycia; najczęściej jest to dodawanie przez odejmowanie.
sam yi
6
@ Ajedi32, tak ... za pomocą schematów można uzyskać pojedynczy zatwierdzenie atomowe w jednym dzienniku transakcji i wykonać kopię zapasową wszystkich danych w jednym ujęciu, zamiast dwóch baz danych, które nie są zsynchronizowane, a także do zwalczania transakcji rozproszonych.
Matthew Whited
31

Podobnie jak Przestrzeń nazw kodów C #.

Airbai
źródło
16
Niestety schematy i przestrzenie nazw .NET nie działają razem dobrze z perspektywy ORM ( a mianowicie Entity Framework ). Tabele w MyDatabase.MySchemaschemacie nie magicznie odwzorowują klas encji w MyProject.MyDatabase.MySchemaprzestrzeni nazw. Warto również zauważyć, że wszelkie .hacki kropkowe w nazwach tabel kończą się jako podkreślenia ( _) w nazwach klas. Tylko jedzenie dla niefortunnej myśli.
Dan Lugg,
2
Dobra analogia do nauczania. Nie sądzę, aby można było to traktować w 100% dosłownie ... (te zastrzeżenia w praktyce brzmią nieznacznie)
Samantha Branham
6
Osobiście chciałbym, aby były bardziej podobne do przestrzeni nazw .NET, tak aby można było zagnieździć dowolną liczbę schematów ( tak jak w przypadku przestrzeni nazw ) do celów organizacyjnych. To i chciałbym, żeby lepiej mapowały w EF.
Dan Lugg
Są one nie jak przestrzenie nazw w dowolnym języku mogę myśleć.
Tanveer Badar
29

Mogą również zapewnić rodzaj ochrony przed kolizją nazw dla danych wtyczek. Na przykład nowa funkcja zmiany przechwytywania danych w SQL Server 2008 umieszcza tabele, których używa, w osobnym schemacie cdc. W ten sposób nie muszą się martwić konfliktem nazw między tabelą CDC a rzeczywistą tabelą używaną w bazie danych, a w związku z tym mogą celowo ukrywać nazwy prawdziwych tabel.

Joel Coehoorn
źródło
17

Wiem, że to stary wątek, ale sam przejrzałem schematy i sądzę, że poniższe przykłady mogą być kolejnym dobrym kandydatem do użycia schematu:

W magazynie danych, w którym dane pochodzą z różnych źródeł, możesz użyć innego schematu dla każdego źródła, a następnie np. Kontrolować dostęp na podstawie schematów. Pozwala również uniknąć możliwych kolizji nazw między różnymi źródłami, ponieważ inny plakat odpowiedział powyżej.

tobi18
źródło
9

Jeśli zachowujesz dyskretny schemat, możesz skalować aplikację, wdrażając dany schemat na nowym serwerze DB. (Zakłada się, że masz aplikację lub system, który jest wystarczająco duży, aby mieć odrębną funkcjonalność).

Przykład: rozważ system, który wykonuje rejestrowanie. Wszystkie tabele rejestrowania i SP znajdują się w schemacie [rejestrowanie]. Rejestrowanie jest dobrym przykładem, ponieważ rzadko (jeśli w ogóle) inne funkcje w systemie nakładałyby się (czyli łączą się) na obiekty w schemacie rejestrowania.

Wskazówka dotycząca korzystania z tej techniki - należy ustawić inny ciąg połączenia dla każdego schematu w aplikacji / systemie. Następnie wdrażasz elementy schematu na nowym serwerze i zmieniasz parametry połączenia, gdy potrzebujesz skalować.

Hogan
źródło
8

Zgadzam się z Brentem w tej sprawie ... zobacz tę dyskusję tutaj. http://www.brentozar.com/archive/2010/05/why-use-schemas/

W skrócie ... schematy nie są zbyt przydatne, z wyjątkiem bardzo specyficznych przypadków użycia. Sprawia, że ​​bałagan. Nie używaj ich, jeśli możesz pomóc. I staraj się przestrzegać zasady K (eep) I (t) S (imple) S (tupid).

sam yi
źródło
2
Nie sądzę, że Brent twierdzi, że „schematy są złe”, tylko że używanie schematów innych niż domyślne jest znacznie bardziej skomplikowane niż używanie schematu domyślnego. Reszta podsumowania jest dokładna.
Joseph Daigle,
„Jeśli [schematy] zostaną właściwie użyte, pozwolą ci segregować uprawnienia według grup obiektów.” ~ brentozar.com/archive/2010/05/why-use-schemas
LL Learner
7

Nie widzę korzyści z aliasingu użytkowników powiązanych ze schematami. Oto dlaczego ...

Większość osób początkowo łączy konta użytkowników z bazami danych za pomocą ról. Gdy tylko przypiszesz użytkownika do sysadmin lub do roli db_owner roli bazy danych, w dowolnej formie, konto to jest aliasowane do konta użytkownika „dbo” lub jest pełne uprawnienia do bazy danych. Kiedy to nastąpi, bez względu na to, jak przypisujesz się do schematu wykraczającego poza domyślny schemat (który ma taką samą nazwę jak twoje konto użytkownika), te prawa dbo są przypisywane do obiektu, który tworzysz w ramach użytkownika i schematu. To trochę bezcelowe ..... tylko przestrzeń nazw i dezorientuje prawdziwą własność tych obiektów. Jego kiepski projekt, jeśli mnie zapytasz ... ktokolwiek go zaprojektował.

To, co powinni byli zrobić, to utworzyć „Grupy”, wyrzucić schematy i role i po prostu pozwolić ci na grupowanie grup grup w dowolnej kombinacji, którą lubisz, a następnie na każdym poziomie powiedzieć systemowi, czy uprawnienia są dziedziczone, odrzucane lub zastępowane niestandardowymi te. Byłoby to o wiele bardziej intuicyjne i pozwoliłoby DBA lepiej kontrolować, kim są prawdziwi właściciele tych obiektów. Obecnie sugeruje się, że w większości przypadków domyślny użytkownik SQL Server programu dbo ma te prawa .... nie użytkownika.

burzliwy
źródło
7

W sklepie ORACLE, w którym pracowałem przez wiele lat, schematy były używane do enkapsulacji procedur (i pakietów), które dotyczyły różnych aplikacji front-end. Inny schemat „API” dla każdej aplikacji często miał sens, ponieważ przypadki użycia, użytkownicy i wymagania systemowe były zupełnie inne. Na przykład jeden schemat „API” dotyczył aplikacji programistycznej / konfiguracyjnej do użytku wyłącznie przez programistów. Kolejnym schematem „API” był dostęp do danych klienta za pośrednictwem widoków i procedur (wyszukiwania). Kolejny kod zamknięty w schemacie „API”, który został użyty do synchronizacji danych programistycznych / konfiguracyjnych i klienta z aplikacją, która ma własną bazę danych. Niektóre z tych schematów „API”, pod osłonami, nadal miałyby ze sobą wspólne procedury i funkcje (za pośrednictwem innych „WSPÓLNYCH”

Powiem, że brak schematu prawdopodobnie nie jest końcem świata, choć może być bardzo pomocny. Naprawdę, to brak pakietów w SQL Server, który naprawdę stwarza problemy w moim umyśle ... ale to inny temat.

LL Learner
źródło
W przypadku Oracle, ponieważ 1 instancja = 1 baza danych = 1 licencja do zapłaty, ludzie używają szemów, aby uniknąć tworzenia kolejnej bazy danych i płacenia za inną licencję. W SQl Server, 1 serwer może obsłużyć wiele baz danych.
Patrick Honorez,
5

Myślę, że schematy są jak wiele nowych funkcji (czy to SQL Servera, czy innego narzędzia programowego). Musisz dokładnie ocenić, czy korzyść z dodania go do zestawu programistycznego kompensuje utratę prostoty w projektowaniu i implementacji.

Wydaje mi się, że schematy są mniej więcej równoważne opcjonalnym przestrzeniom nazw. Jeśli znajdujesz się w sytuacji, w której kolidują nazwy obiektów, a stopień szczegółowości uprawnień nie jest wystarczający, oto narzędzie. (Chciałbym powiedzieć, że mogą istnieć problemy z projektowaniem, którymi należy się zająć na bardziej podstawowym poziomie).

Problem może polegać na tym, że jeśli tak się stanie, niektórzy programiści zaczną używać go do krótkoterminowych korzyści; a kiedy już tam jest, może stać się kudzu.

dkretz
źródło
3

W SQL Server 2000 utworzone obiekty zostały połączone z tym konkretnym użytkownikiem, np. Jeśli użytkownik powie, że Sam tworzy obiekt, powiedzmy Pracownicy, ta tabela wyglądałaby następująco: Sam.Employees. Co jeśli Sam opuści firmę lub przeprowadzi się do innego obszaru działalności. Gdy tylko usuniesz użytkownika Sama, co stanie się z tabelą Sam.Employees? Prawdopodobnie musiałbyś najpierw zmienić właściciela z Sam.Employees na dbo.Employess. Schemat zapewnia rozwiązanie tego problemu. Sam może stworzyć cały swój obiekt w schemacie takim jak Emp_Schema. Teraz, jeśli stworzy obiekt Pracownicy w Emp_Schema, wówczas obiekt będzie nazywany Emp_Schema.Employees. Nawet jeśli konto użytkownika Sam musi zostać usunięte, nie wpłynie to na schemat.

Tariq Awan
źródło
1
Nie jest to już prawdą, ponieważ od 2000 r. Pojawiły się dwie nowe wersje
Hogan
0

rozwój - każdy z naszych deweloperów ma własny schemat gry w piaskownicy.

Nick Van Brunt
źródło
29
-1 Lepiej jest udostępnić programistom oddzielne całe kopie bazy danych, aby mogli grać na ich własnym komputerze. W przeciwnym razie mogliby tylko bezpiecznie zmienić to, co jest w ich schemacie. Utrudnia to promocję do życia, a także komplikuje rozdzielanie schematów z innych powodów opisanych w innych odpowiedziach.
Stephen Turner
5
Nie mogę mówić za aplikacją, nad którą pracujesz ... ale twój rozwój powinien odzwierciedlać produkcję w jak największym stopniu. Posiadanie schematów w dev, a nie w pro może być problematyczne.
sam yi
0

Oto dobry przykład implementacji użycia schematów z SQL Server. Mieliśmy kilka aplikacji z dostępem typu ms. Chcieliśmy przekonwertować je na portal aplikacji ASP.NET. Każda aplikacja MS-Access jest zapisywana jako aplikacja dla tego portalu. Każda aplikacja MS-Access ma własne tabele bazy danych. Niektóre z nich są powiązane, umieszczamy je we wspólnym schemacie dbo programu SQL Server. Reszta otrzymuje własne schematy. W ten sposób chcemy wiedzieć, które tabele należą do aplikacji w portalu aplikacji ASP.NET, które można łatwo nawigować, wizualizować i utrzymywać.

Herman Van Der Blom
źródło