2017-12-26 2 views
-1

Ich erstelle einen Online-Marktplatz für Käufer und Verkäufer. Eine der Fragen an Verkäufer ist: "Akzeptieren Sie Produktrückgaben?" Wenn ja, ist die zweite Frage "Wer zahlt für den zurückgegebenen Artikel: der Käufer oder der Verkäufer?"MySQL Normalisierung vs Denormalisierung

Ich gehe immer für normalisierte Designs in der Regel. So würde entwerfen ich in der Regel die Datenbank wie folgt mit einem Artikel Tisch und ein return_payers Tabelle und verwenden Sie einen Join:

items 
id | title | description | price | returns_accepted | 
------------------------------------------------------------ 
1 | blah | blah blah | 80.00 |  0 // No 
2 | blah | blah blah | 120.00 |  1 // Yes 
3 | blah | blah blah | 40.00 |  1 
4 | blah | blah blah | 60.00 |  0 

return_payers 
id | item_id | payer 
-------------------------------- 
1 | 2  | 1 //Buyer 
2 | 3  | 2 //Seller 

Aber weil es nur ein Extra an Information Ich denke, ich könnte einfach anhängen eine zusätzliche Spalte mit den Produkten wie so, die Beschleunigung die Notwendigkeit einer Verknüpfung und möglicherweise reduzieren Lesezeit:

products 
id | title | description | price | returns_accepted | returns_payer 
---------------------------------------------------------------------------- 
1 | blah | blah blah | 80.00 |  0   |  NULL 
2 | blah | blah blah | 120.00 |  1   |   1 
3 | blah | blah blah | 40.00 |  1   |   2 
4 | blah | blah blah | 60.00 |  0   |  NULL 

Der Grund, warum ich frage mich ist, weil ich einfach nicht ein Beispiel wie diese haben aber die Produkte haben viele kleine Fragen wie diese, wie ich Haben Sie eine Garantie? ja/nein und wenn ja, wie lange usw. Wenn ich 20 dieser kleinen Fragen sage, würde das normalisierte Design 20 weitere Tabellen mit 20 Joins erfordern, das denormalisierte Design würde eine Tabelle, keine Joins, aber viele NULL-Werte haben.

Da es sich um einen Online-Marktplatz handelt, werden die Tabellen viel mehr gelesen als aktualisiert.

Beratung willkommen. Vielen Dank.

+0

Keines dieser Szenarien ist mehr oder weniger normalisiert als das andere in irgendeiner sinnvollen Weise. Technisch gesehen könnte man sagen, dass der Unterschied zwischen 5NF und 6NF liegt, aber das ist den Aufwand kaum wert. Wer für Retouren bezahlt, ist ein Attribut des Artikels und scheint als Attribut in der Artikeltabelle vollkommen gültig zu sein. Mit Nullen ist nichts verkehrt. –

+1

Warum nicht 0, 1 oder 2 (nicht akzeptiert, Käufer, Verkäufer) – Strawberry

+0

@ Michael-sqlbot Der zweite Entwurf ist eindeutig eine Entnormalisierung des ersten in einem bestimmten sinnvollen idiomatischen SQL-Sinn (mit der linken Verbindung statt der inneren Verbindung). Obwohl es pro Rendite vermutlich einen Zahler gibt, handelt es sich um eine Denormalisierung einer * unnötigen * Normalisierung. Worauf beziehen Sie sich vielleicht? – philipxy

Antwort

0

Dies ist eine philosophische Frage, da es viele 2c Meinungen und "in meiner Erfahrung" Ideen gibt. Also, in dieser Welt, hier ist eine:

Denormalisierung einer Tabelle ist völlig normal, solange Ihre Datenprozesse klar definiert sind. Ihre Datenbank muss zwei Gedanken haben: Erstens muss sie Ihre Anwendung schnell unterstützen. Zweitens muss es so gut wie möglich zukunftssicher sein, um Engpässe zu vermeiden, wenn Ihre Datenbestände und Anwendungen wachsen.

Eine Idee für Sie ist es, Ihr normalisiertes Datenmodell aufzubauen, so dass Sie Business Intelligence dagegen durchführen können, dann eine automatische ETL (Datenübertragung), wo Sie Ihre Daten in eine separate hyperindizierte Aggregationstabelle denormalisieren können , um Ihre Operationen zu unterstützen. Da Sie es auf diese Weise tun, können Sie Ihre Daten jetzt für zukünftige Verkäufe nutzen und eine bestimmte Tabelle unterstützt Ihre Operationen. Wenn Sie eine Analyse Ihrer Daten durchführen möchten, eine normalisierte Datenbank (Data Warehouse) auf einem anderen Server haben, verhindert Ihre denormalisierte (Operations-Datenbank) Verlangsamungen in Ihrem Web Server, während Sie Ihre Analysen durchführen.

Hoffe, das hilft.

+0

Es ist keine philosophische Entscheidung, es ist eine technische Entscheidung. Dies erfordert eine technische Analyse auf der Grundlage von Normalisierung und Kosten-Nutzen-Abwägung. – philipxy

+0

Ich stimme zu. Ich meinte philosophisch, weil es mehrere Wege geben kann, dies zu lösen. Und auch Kimball und Inman konnten sich in einigen Punkten nicht einigen. :). Ich mag die Frage tho. – arcee123

Verwandte Themen