Domanda

La prima forma normale dice che l'ordinamento delle righe non dovrebbe avere importanza.Ciò significa che una tabella con la data come parte della chiave non è 1NF?per esempio.Considera una tabella dei prezzi dei ticker in cui data/ora fa parte del PK.In questo caso, ottieni l'ultimo prezzo ordinando i dati per data e selezionando la prima riga.Ciò significa che per soddisfare 1NF è necessario dividere la tabella in:1) TickerCurrentPrice (1 riga per ticker) 2) TickerHistoricalPrice grazie

È stato utile?

Soluzione

1NF è l'aspetto di una tabella che rappresenta a relazione, non di un tavolo in quanto tale.

Se la tua relazione dice ticket HAS price, che è a 1NF violazione, poiché non è possibile determinare se a ticket HAS O HAS NOT IL price esaminando un singolo record.Dovrai recuperare tutti i prezzi su questo biglietto e selezionarne l'ultimo, il che viola il non-ordering rule del 1NF.

Se la tua relazione dice ticket HAD BEGUN TO COST price ON date, allora è in 1NF va bene, perché ogni record dice quello che dice: Questo ticket costi Questo price da Questo date.

Quindi diciamo che questa tabella non è conforme al 1NF Quando che rappresentano la prima relazione, ma è conforme quando che rappresentano il secondo.

La tabella rimane ovviamente la stessa.

Ciò non significa necessariamente che sia necessario dividere le tabelle.

Il punto centrale di relational databases è che puoi usare relational operators per convertire una relazione in un'altra.

Cos'è un relation in termini di RDBMS?È una tabella che mostra Tutto combinazioni di Tutto valori possibili che sono in questa relazione tra loro.

Ad esempio, se dobbiamo costruire una relazione di uguaglianza sui numeri naturali da 1 A 5, abbiamo questa tabella:

1 1
2 2
3 3
4 4
5 5

Tutte le coppie che appaiono in questa tabella sono in relazione di uguaglianza;tutte le coppie che non appaiono, non lo sono.Non vediamo (2, 3) qui, o (4, 5), poiché non sono uguali.

Ma non è necessario mantenere l'intera coppia nel database.Mantieni invece i valori singoli e scrivi una query:

SELECT n1.number, n2.number
FROM number n1, number n2
WHERE n1.number = n2.number

, che ti dà lo stesso risultato.

In realtà, i moduli normali ti consentono di mantenere più semplice possibile tabelle di relazione nel database e costruire relazioni più complesse da esse utilizzando SQL interrogazioni.

Nel tuo caso, se scrivi una query (o definisci una vista) nel modo seguente:

SELECT ticket, price
FROM mytable
WHERE (ticket, date) IN (
  SELECT ticket, MAX(date)
  FROM mytable
  GROUP BY
    ticket
  )

, ottieni la relazione (ticket HAS price) da (ticket HAD BEGUN TO COST price ON date) esattamente come se stessi mantenendo l'intera tabella nel database.

Altri suggerimenti

No "selezionare ... ORDER BY ..." non viola 1NF. Fila (e colonna) ordinamento che viola 1NF più sulle situazioni lungo le linee di "selezionare * da XYZ, e poi il terza riga superiore della colonna e quarto da sinistra". Sì, ho visto DB disegni del genere.

Ciò che si intende è che se si vuole registrare un qualche ordinamento dei dati (come per data), allora dovrebbe essere registrato esplicitamente, per esempio.in una colonna di data.Ciò che sarebbe sbagliato sarebbe avere solo l'ordinazione implicito nell'ordine fisico delle righe sul disco (supponendo che tu possa comunque controllarlo).In altre parole, devi ORDER BY qualche colonna per recuperare i dati in quell'ordine.

No. Ciò significa che non esiste un ordine intrinseco. Se si desidera che la data dell'ultimo prezzo che devi select max(date) dal vostro tavolo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top