it-swarm-eu.dev

Návrh databáze: Nová tabulka versus nové sloupce

(Toto bylo navrženo, aby se zde opakovalo z StackOverflow)

V současné době existuje tabulka .. a je třeba začít přidávat nové datové sloupce. Ne každý záznam (i po dalším datu po přidání nových datových sloupců) bude mít data. Zajímalo by mě, jestli je to vhodnější pro novou tabulku, protože se jedná o rozšíření některých datových řádků a nelze ji použít pro každý řádek.

Jinými slovy, protože pro tyto nové datové prvky bude mnoho nevyužitých sloupců, zdá se, že by to bylo vhodnější pro novou tabulku?

První tabulka je záznam zobrazení stránek (v současné době 2 miliony záznamů)

 - id 
 - IP adresa 
 - časy prohlížení 
 - created_at timestamp 
 - datum 

pro každou IP adresu se provádí záznam denně - a do zobrazení času za den se přidávají po sobě jdoucí zobrazení stránek

další pole by byla pro sledování bodu původu (tj. zdroj/médium/kampaň google analytics)

Ne každá návštěva bude mít tyto informace. Předpokládám, že data budou mít asi 10% řádků (protože se obvykle připisují pouze při první návštěvě)

Hlavním využitím údajů by bylo připsat, odkud lidé přišli. Toto může skončit být používán častěji (který pak vypadá, že půjčuje sebe k jediné tabulce)

Oceníte zpětnou vazbu - v případě potřeby můžete přidat další

38
cgmckeever

To, s čím zápasíte, je vertikální dělení. Toto je technika návrhu fyzické databáze pro zlepšení výkonu. Stejně jako u jakékoli jiné techniky návrhu fyzické databáze závisí její použitelnost na konkrétních dotazech, které se pokoušíte optimalizovat, a pokud tato technika optimalizuje. Z logického hlediska, pokud tato nová pole závisí na klíči kandidáta pro vaši entitu, pak to jsou fakta o tom, která k tomu patří. Nejprve byste se měli ujistit, že plně chápete funkční závislost těchto nových polí na vašich kandidátských klíčích, abyste si ověřili, že skutečně jde o fakta o denním zobrazení stránky. Pokud ano, rozhodnutí o jejich rozdělení do jiné tabulky je optimalizace výkonu, která by měla být provedena, pouze pokud dosáhne vašich výkonnostních cílů.

Obecně je vertikální rozdělení užitečné, pokud budete dotazovat tyto nové sloupce zřídka a zřetelně od ostatních sloupců v původní tabulce. Umístěním těchto sloupců do jiné tabulky, která sdílí stejnou PK jako vaše stávající tabulka, můžete ji přímo dotazovat, když chcete tyto nové sloupce, a získat mnohem větší průchodnost, protože pro tuto novou tabulku budete mít mnohem více řádků na stránku na disku. protože na těchto řádcích nebudou sedět všechny sloupce z původní tabulky. Pokud však budete tyto sloupce vždy dotazovat společně se sloupci v původní tabulce, pak by vertikální oddíl nedal velký smysl, protože je vždy budete muset připojit vnější, abyste je získali. Stránky z tabulek na disku přicházejí do fondu vyrovnávacích pamětí DBMS samostatně, nikdy se nepřipojily, a tak se bude muset spojit s každým spuštěním dotazu, i když jsou data připojena do fondu vyrovnávacích pamětí. V tomto scénáři by jejich vytvoření NULLABLE sloupců v původní tabulce umožnilo úložnému stroji DBMS, aby je efektivně ukládal, když je NULL, a eliminovalo by potřebu připojit se při načítání.

Zdá se mi, že váš případ použití je ten druhý a jejich přidání jako NULLABLE do původní tabulky je způsob, jak jít. Ale stejně jako u všeho jiného v návrhu databáze, záleží na tom, a aby bylo možné učinit správné rozhodnutí, musíte znát své očekávané pracovní vytížení a to, na čem závisí dobrá volba. Dobrým příkladem řádného použití pro vertikální dělení by byl panel vyhledávání osob, kde vaše aplikace obsahuje jen velmi zřídka obsažené informace o osobě, kterou by někdo mohl chtít hledat, ale jen zřídka. Pokud tyto informace vložíte do jiné tabulky, máte dobré možnosti pro výkon. Můžete napsat hledání tak, abyste měli 2 dotazy - ten, který používá pouze pro vyhledávání hlavní, vždy naplněné informace (jako příjmení nebo ssn), a ten, který vnější spojuje velmi zřídka naplněné informace, pouze když je požadován pro vyhledávání. Nebo můžete využít optimalizátor DBMS, pokud je dostatečně chytrý, aby pro danou sadu hostitelských proměnných rozpoznal, že vnější spojení není potřeba a nebude jej provádět, a proto stačí vytvořit pouze 1 dotaz.

Jakou platformu DBMS používáte? Způsob, jakým platforma zpracovává úložiště sloupců NULL, optimalizuje váš dotaz a dostupnost podpory řídkých sloupců (má to server SQL), ovlivní rozhodnutí. Nakonec bych doporučil vyzkoušet oba návrhy v testovacím prostředí s produkčními daty a pracovní zátěží a zjistit, které lépe dosahují vašich výkonnostních cílů.

29
Todd Everett

Osobně se přikláním k přidání sloupců do stávající tabulky. Nový stůl vám nic nekupuje:

  • opravdu ušetříte mnoho místa, protože hodnoty NULL v původní tabulce nezabírají žádný prostor a nová tabulka potřebuje nějaký identifikátor, který stejně kompenzuje jakékoli úspory
  • vaše dotazy se stávají složitější ... where newcolumn is not null se stává left outer join

V jediné tabulce to jen znamená, že se velikost vašeho řádku může v jednotlivých stránkách lišit - to by však nemělo mít vliv na mnoho vašich stávajících stránek, zejména pokud je váš seskupený index na monotónně rostoucím sloupci (identita nebo datum/čas).

10
Aaron Bertrand

Vzhledem k informacím, které jste poskytli, a vzhledem k tomu, že cílem je pouze obecná normalizace, bych pravděpodobně jednoduše přidal nulovatelné sloupce, ale neposkytl jste dostatek informací o tom, jak budou data použita, abyste věděli, jaký je nejlepší způsob, jak data modelovat. je.

V závislosti na tom, jak tyto údaje skutečně používáte, můžete zvážit jiný datový model. Pokud vkládáte tato data do přehledů, možná budete chtít prozkoumat dimenzionální model, který může být efektivnější pro určité typy reportingu - například časová analýza funguje dobře s rozdělením časové a časové dimenze.

Pro zodpovězení analytických otázek, například „jaká je nejoblíbenější denní doba pro návštěvy z kampaní jako X“ nebo „jaký den kampaně vidíme největší počet návštěv za hodinu“, nebude fungovat jediný sloupec data-čas. velmi dobře (ale to lze dokonce rozdělit v relačním modelu), a existuje mnoho případů, kdy můžete IP adresu považovat za dimenzi (snad s nějakým druhem geografických údajů ve sněhové vločky).

4
Cade Roux