Nagy asztal vagy több külön táblázat (adatbázis-tervezési kérdés)
Ez egy adatbázis-tervezési kérdés.

Szeretnék létrehozni egy számla webalkalmazást, egy számlának több eleme lehet, és minden felhasználó rendelkezhet egy listával a tárolható termékekről, és választhatja a számlatételhez való hozzáadást.
A kérdéseim a következők:
1. Táblázzam-e a teljes termékkészletet az összes alkalmazást használó felhasználó számára egyetlen táblázatban? Vagy minden felhasználóhoz külön termékkészlet táblázatot hoztak létre? 2. Ez még lehetséges is?
1 asztal könnyebb, de ha egy asztal túl nagyra nő, lesz-e problémám? (elsődleges kulcs INT).
5 válasz
Felhasználónként egy táblázat rossz ötlet. Tartsa az összes készletét egy táblázatban, a userid beírva. A táblázatnak elég masszívnak kell lennie ahhoz, hogy ez bármilyen ipari kis- és középvállalkozás számára problémát okozzon (várjon, amíg több tízmillió sor van, mielőtt még ilyen kérdéseket tesz fel).
Ha a felhasználó leggyakrabban hozzáfér a készlethez, akkor felgyorsíthatja az ilyen lekérdezéseket úgy, hogy a felhasználói azonosítót egy csoportosított kulcs első oszlopává teszi, és arra kényszeríti a felhasználói készletet, hogy a lemezen gyűjtsön össze. Ismét ne gondoljon ezekre a kérdésekre, amíg észre nem vesz egy igazi teljesítményromlást.
Ezek a felhasználók által létrehozott termékek, vagy te irányítod őket?
Mindenesetre azt hiszem, hogy lesz egy táblázata a termékekhez és egy táblázat a felhasználók számára. A termékek forrásától függően (más szavakkal, ha kizárólag és valószínűleg a felhasználó tölti fel őket, vagy ha bármennyi felhasználó hozzáfér hozzá), akkor rendelkeznie kell egy táblázattal, amely a felhasználókat zaklatja a termékek felé. Ha a termékek valóban kizárólagosak egy adott felhasználó számára, akkor elegendő lenne csak egy felhasználói azonosítót tárolni a termék regisztrációjával együtt.
Ne aggódjon az asztal mérete miatt, legalábbis kezdetben nem. Az SQL Server egy hatékony adatbázis-eszköz, csak győződjön meg arról, hogy megfelelő az adatbázis-normalizálás és a megfelelő indexelés.
Amint a táblázat növekszik, a kiszolgáló konfigurációja és elrendezése egyre fontosabb lesz, csakúgy, mint az indexválasztás és a lekérdezések írása. Ha azonban nem számít arra, hogy sok millió sora lesz, akkor nem, akkor nem lesz túl sok sor ahhoz, hogy egy asztal jól működjön.
Általános szabály, hogy a táblázatoknak tartalmazniuk kell adatokat, de nem adatokat. Ha kezdi látni a táblázatot, jelezze, hogy milyen adatokról van szó, valószínűleg a 2. kategóriába tartozik, és biztonsági másolatot kell készítenie, és át kell gondolnia, hogy mit csinál.
A 2. opciónak problémái vannak. Joe Celko erre a tervezési hibára az asztal felosztására hivatkozik; Data Chris arra hivatkozik, hogy sérti az ortogonális tervezés elvét .
Ha minden felhasználónak külön termékkészlete van, amelyek saját tulajdonában vannak vagy amelyeket kezel, akkor később egyetlen táblát lehet particionálni. Ahogy mások javasolják, csak akkor kell aggódnia a teljesítmény miatt, ha több tízmillió termékre számít.
Azt javaslom, hogy egy étkezéssel kezdjük. Ha a termék elrendezése minden felhasználó számára azonos, akkor ez egy nagyon egyszerű és hatékony kialakítás.
Ha azonban a különböző felhasználókhoz kapcsolódó termékek eltérő sémát igényelnek, akkor egy nagyon keskeny táblázattal rendelkezhet (minden rekordban sok üres/NULL mező van, ami mindenki számára befolyásolja a teljesítményt).
Ennek általános megközelítése az EAV (Entity-Attribute-Value) tábla, amelynek három oszlopa van: termékazonosító, attribútumnév és attribútumérték. Ez egy teljesen dinamikus megoldás, és nagyon egyszerű. Ez azonban megnehezíti a deklaratív korlátozások végrehajtását.
Előnyös megközelítésem egy dinamikus sémához az, hogy a statikus/mindig szükséges mezőket az állandó séma/táblázat részévé tegyem. A dinamikus rész létrehozható xml mezőként, és xml séma (vagy gyűjtemény) korlátozhatja. Az adatintegritás ilyen módon valósítható meg, és további bitekhez csak egyetlen mezőre van szükség.