Discussione:
Escludere valore "" dalle relazioni
(troppo vecchio per rispondere)
Antonio Budano
2006-01-03 17:59:20 UTC
Permalink
Salve,

definendo delle relazioni tra tabelle, è possibile escludere il valore ""
(stringa vuota) dall'essere verificato nella tabella primaria?

Grazie
Antonio Budano
Marcello
2006-01-03 18:03:17 UTC
Permalink
Post by Antonio Budano
Salve,
Ciao,
Post by Antonio Budano
definendo delle relazioni tra tabelle, è possibile escludere il valore ""
(stringa vuota) dall'essere verificato nella tabella primaria?
No, per fortuna!
A parte l'opportunità di usare tipi della categoria stringa [char,
varchar e compagnia] in relazione, l'unico modo per evitare che il dato
sia relazionato è sfruttare il valore null [e i puristi anche su questo
storcono il naso].
Post by Antonio Budano
Grazie
Antonio Budano
marc.
Antonio Budano
2006-01-03 18:17:34 UTC
Permalink
Post by Marcello
No, per fortuna!
A parte l'opportunità di usare tipi della categoria stringa [char, varchar
e compagnia] in relazione, l'unico modo per evitare che il dato sia
relazionato è sfruttare il valore null [e i puristi anche su questo
storcono il naso].
Questo significa che nel caso in cui alcuni campi della tabella sono
facoltativi, per poter gestire la relazione mi devo inventare un valore tipo
"00" (o "") che non ha nessun senso ed inserire il relativo record nella
tabella primaria.

Alternativa è non gestire le relazioni e valorizzare il campo con "". Il
problema con <null> è che a volte è difficile da inserire tramite
l'applicazione e i componenti visuali.

Qualche idea?

Ciao
Antonio
Marcello
2006-01-03 18:34:02 UTC
Permalink
Post by Antonio Budano
Questo significa che nel caso in cui alcuni campi della tabella sono
facoltativi, per poter gestire la relazione mi devo inventare un valore tipo
"00" (o "") che non ha nessun senso ed inserire il relativo record nella
tabella primaria.
Si, i puristi pretendono una cosa di questo tipo, magari invece di "00"
o "" si potrebbe usare qualcosa di piùà esplicito tipo "<Non Definito>"
Post by Antonio Budano
Alternativa è non gestire le relazioni e valorizzare il campo con "".
?? Intendevi:"Alternativa è non gestire le relazioni e valorizzare il
campo con null." immagino...
Post by Antonio Budano
Il problema con <null> è che a volte è difficile da inserire tramite
l'applicazione e i componenti visuali.
?? Perchè?
Post by Antonio Budano
Qualche idea?
Si, non usare le stringhe come relazioni ma tipi più adatti [interi
grandi o piccoli, uniqueidentifier ecc...] e gestire i nulli [a questo
punto non esiste più l'ambiguità ""/null]
Post by Antonio Budano
Ciao
Antonio
ciao.
Antonio Budano
2006-01-03 18:50:21 UTC
Permalink
Post by Marcello
Post by Antonio Budano
Alternativa è non gestire le relazioni e valorizzare il campo con "".
?? Intendevi:"Alternativa è non gestire le relazioni e valorizzare il
campo con null." immagino...
No, intendevo proprio "", in quanto se il campo "facoltativo" fa parte della
chiave primaria non può contenere <null>.
Adesso qualcuno direbbe di definire due tabelle ma questo comporterebbe
creare ulteriore codice per aggiornare le due tabelle dipendentemente
dall'obbligatorietà o meno del campo (che dipende ad es. dal tipo
materiale).

A questo punto l'unica soluzione penso sia definire un valore fittizio che
consenta di gestire le relazioni, includendolo nella tabella primaria e
soddisfare il criterio di not null per la chiave primaria.

Ciao
Antonio
Marcello
2006-01-03 19:08:25 UTC
Permalink
Post by Antonio Budano
No, intendevo proprio "", in quanto se il campo "facoltativo" fa parte della
chiave primaria non può contenere <null>.
E ci mancherebbe altro! :-D
Post by Antonio Budano
Adesso qualcuno direbbe di definire due tabelle ma questo comporterebbe
creare ulteriore codice per aggiornare le due tabelle dipendentemente
dall'obbligatorietà o meno del campo (che dipende ad es. dal tipo
materiale).
Mah, secondo me si sta complicando una questione semplice.
Prova [se ti va] a postare la struttura delle due tabelle, forse c'è un
piccolo errore di architettura.
Post by Antonio Budano
A questo punto l'unica soluzione penso sia definire un valore fittizio che
consenta di gestire le relazioni, includendolo nella tabella primaria e
soddisfare il criterio di not null per la chiave primaria.
Non sono daccordo, sono certo che esistono anche altre soluzioni.
Post by Antonio Budano
Ciao
Antonio
marc.
Antonio Budano
2006-01-03 20:26:59 UTC
Permalink
Nellla tabella MaterialStock la cui chiave primaria è costituita dai primi 6
campi, c'è il campo ConfigurationID che è costituito da un GUID (converto in
stringa e genarato dal programma) che deve essere presente nella tabella
Configuration.
Il record della tabella Configuration (contiene i valori per alcune
caratteristiche di una classe, attribuita al tipo materiale) è presente solo
se il tipo materiale è di tipo configurabile, quindi nel caso in cui il
materiale non è configurabile deve contenere il valore "", oppure un valore
del tipo "00000000-0000-0000-000000000000" che devo inserire nellla tabella
Configuration.
Alternativa è quella di gestire due tabelle per lo stock, una per i
materiali configurabili e una per quelli non, di conseguenza anche i report
che attinge a questa tabella si complicano quando in realtà basterebbe
visualizzare un campo vuoto.


CREATE TABLE [dbo].[MaterialStock] (
[CompanyID] [udtCompanyID] NOT NULL ,
[PlantID] [udtPlantID] NOT NULL ,
[WarehouseID] [udtWarehouseID] NOT NULL ,
[SeasonID] [udtSeasonID] NOT NULL ,
[MaterialID] [udtMaterialID] NOT NULL ,
[ConfigurationID] [udtConfigurationID] NOT NULL ,
[CreatedOn] [udtDateTime] NULL ,
[CreatedBy] [udtUserID] NULL ,
[ModifiedOn] [udtDateTime] NULL ,
[ModifiedBy] [udtUserID] NULL ,
[AvailableQuantity] [udtQuantity] NULL ,
[AvailableQuantityPreviousFiscalPeriod] [udtQuantity] NULL ,
[AvailableQuantityPreviousFiscalYear] [udtQuantity] NULL ,
[QualityInspectionQuantity] [udtQuantity] NULL ,
[QualityInspectionQuantityPreviousFiscalPeriod] [udtQuantity] NULL ,
[QualityInspectionQuantityPreviousFiscalYear] [udtQuantity] NULL ,
[BlockedQuantity] [udtQuantity] NULL ,
[BlockedQuantityPreviousFiscalPeriod] [udtQuantity] NULL ,
[BlockedQuantityPreviousFiscalYear] [udtQuantity] NULL ,
[TransferQuantity] [udtQuantity] NULL ,
[TransferQuantityPreviousFiscalPeriod] [udtQuantity] NULL ,
[TransferQuantityPreviousFiscalYear] [udtQuantity] NULL ,
[ReturnQuantity] [udtQuantity] NULL ,
[ReturnQuantityPreviousFiscalPeriod] [udtQuantity] NULL ,
[ReturnQuantityPreviousFiscalYear] [udtQuantity] NULL
) ON [PRIMARY]

CREATE TABLE [dbo].[Configuration] (
[ConfigurationID] [udtConfigurationID] NOT NULL ,
[CreatedOn] [udtDateTime] NULL ,
[CreatedBy] [udtUserID] NULL ,
[ModifiedOn] [udtDateTime] NULL ,
[ModifiedBy] [udtUserID] NULL ,
[ConfigurationObjectID] [udtConfigurationObjectID] NOT NULL ,
[ConfigurationElementValue1] [udtConfigurationElementValue] NOT NULL ,
[ConfigurationElementValue2] [udtConfigurationElementValue] NOT NULL ,
[ConfigurationElementValue3] [udtConfigurationElementValue] NOT NULL ,
[ConfigurationElementValue4] [udtConfigurationElementValue] NOT NULL ,
[ConfigurationElementValue5] [udtConfigurationElementValue] NOT NULL ,
[ConfigurationElementValue6] [udtConfigurationElementValue] NOT NULL ,
[ConfigurationElementValue7] [udtConfigurationElementValue] NOT NULL ,
[ConfigurationElementValue8] [udtConfigurationElementValue] NOT NULL ,
[ConfigurationElementValue9] [udtConfigurationElementValue] NOT NULL ,
[ConfigurationElementValue10] [udtConfigurationElementValue] NOT NULL ,
[ConfigurationElementValue11] [udtConfigurationElementValue] NOT NULL ,
[ConfigurationElementValue12] [udtConfigurationElementValue] NOT NULL ,
[ConfigurationElementValue13] [udtConfigurationElementValue] NOT NULL ,
[ConfigurationElementValue14] [udtConfigurationElementValue] NOT NULL ,
[ConfigurationElementValue15] [udtConfigurationElementValue] NOT NULL
) ON [PRIMARY]
GO
Marcello
2006-01-04 09:15:19 UTC
Permalink
Post by Antonio Budano
Nellla tabella MaterialStock la cui chiave primaria è costituita dai primi 6
campi,
Ciao,
6 campi per una chiave e [forse] tutti GUID! Spero tu sia consapevole
che se quella chiave è anche cluster ogni indice si porta dietro un
fardello 96 byte solo per le informazioni di chiave e che ogni relazione
richiede altrettanto spazio!
Non sarebbe il caso di definire una chiave su un surrogato del tipo
MaterialStockID e definire un vincolo univoco sui sei campi?
Post by Antonio Budano
c'è il campo ConfigurationID che è costituito da un GUID (converto in
stringa e genarato dal programma) che deve essere presente nella tabella
Configuration.
Come sarebbe "converto in stringa"? L'uniqueidentifier è uno dei tipi
dato meno ambigui e meglio manipolabili in assoluto, perchè fare un
passo indietro e metterci una stringa????
Post by Antonio Budano
Il record della tabella Configuration (contiene i valori per alcune
caratteristiche di una classe, attribuita al tipo materiale) è presente solo
se il tipo materiale è di tipo configurabile, quindi nel caso in cui il
materiale non è configurabile deve contenere il valore "", oppure un valore
del tipo "00000000-0000-0000-000000000000" che devo inserire nellla tabella
Configuration.
Esistono architetture molto più efficienti che evitano questi campi del
tipo "popolabile solo se quell'altro campo ha un certo valore".
Questo è un errore di architettura, non avrai poi gli strumenti per
garantire l'integrità dei dati se non pesanti trigger e codice complesso.
Hai scritto un paio di post fa "Adesso qualcuno direbbe di definire due
tabelle...". Non ho capito benissimo il significato di Configuration e
non saprei consigliare un'architettura senza informazioni complete, ma
forse si, un'altra tabella potrebbe tornare comoda. Se poi i client che
accedono a questo db lo fanno sempre e solo via viste e stored non ti
devi preoccupare del livello di complessità della base dati, lo strato
"pubblico" [viste e storeds appunto] può essere tranquillamente
denormalizzato.
Post by Antonio Budano
Alternativa è quella di gestire due tabelle per lo stock, una per i
materiali configurabili e una per quelli non, di conseguenza anche i report
che attinge a questa tabella si complicano quando in realtà basterebbe
visualizzare un campo vuoto.
No, personalmente questa scelta non mi sembra affatto necessaria.
Inoltre un report dovrebbe accedere a una vista dedicata e non dovrebbe
creare difficoltà sulla progettazione dell'architettura. L'architettura
va pensata per accogliere al meglio la logica dei dati e non per
rispondere a questioni di interfaccia. Per favorire questo passaggio
esistono appunto viste storeds e funzioni.
Post by Antonio Budano
CREATE TABLE [dbo].[MaterialStock] (
[CompanyID] [udtCompanyID] NOT NULL ,
[PlantID] [udtPlantID] NOT NULL ,
[WarehouseID] [udtWarehouseID] NOT NULL ,
[SeasonID] [udtSeasonID] NOT NULL ,
[MaterialID] [udtMaterialID] NOT NULL ,
[ConfigurationID] [udtConfigurationID] NOT NULL ,
[CreatedOn] [udtDateTime] NULL ,
[CreatedBy] [udtUserID] NULL ,
[ModifiedOn] [udtDateTime] NULL ,
[ModifiedBy] [udtUserID] NULL ,
[AvailableQuantity] [udtQuantity] NULL ,
[AvailableQuantityPreviousFiscalPeriod] [udtQuantity] NULL ,
[AvailableQuantityPreviousFiscalYear] [udtQuantity] NULL ,
[QualityInspectionQuantity] [udtQuantity] NULL ,
[QualityInspectionQuantityPreviousFiscalPeriod] [udtQuantity] NULL ,
[QualityInspectionQuantityPreviousFiscalYear] [udtQuantity] NULL ,
[BlockedQuantity] [udtQuantity] NULL ,
[BlockedQuantityPreviousFiscalPeriod] [udtQuantity] NULL ,
[BlockedQuantityPreviousFiscalYear] [udtQuantity] NULL ,
[TransferQuantity] [udtQuantity] NULL ,
[TransferQuantityPreviousFiscalPeriod] [udtQuantity] NULL ,
[TransferQuantityPreviousFiscalYear] [udtQuantity] NULL ,
[ReturnQuantity] [udtQuantity] NULL ,
[ReturnQuantityPreviousFiscalPeriod] [udtQuantity] NULL ,
[ReturnQuantityPreviousFiscalYear] [udtQuantity] NULL
) ON [PRIMARY]
Questa tabella è molto ben scritta con una chiarissima naming convention
e tutti i tipi dati definiti per bene come User Data Types [in un modo
che a me appare francamente addirittura eccessivo :-D ] però sui
contenuti ha un sacco di cose che non mi piacciono.

Anzitutto ha tutta l'aria di essere una tabella di riepiloghi e io sono
radicalmente contrario a queste strutture [ma esistono pareri favorevoli
molto più autorevoli del mio] se la questione ti interessa puoi dare
un'occhio a questo post:
http://groups.google.it/group/microsoft.public.it.sql/msg/ffc8aad039538d49?hl=it&

Inoltre non amo l'appesantimento dovuto alle informazioni di log
[CreatedOn, CreatedBy...]. Grazie all'univocità a livello di db [e
superiore] dei GUID, questo tipo dato permette di creare strutture del tipo

create table t_Log(RecordID uniqueidentifier,Date datetime,User
uniqeidentifier)

E in questa tabella archiviare tutte le informazioni di modifica di
tutto il db. Osserva come:

1) Si tratta di una struttura denormalizzata poichè RecordID è
virtualmente relazionata a ogni tabella del db e quindi andrà in contro
a casi di non integrità dei dati. Personalmente la cosa non mi tocca,
data la natura delle informazioni e periodicamente faccio un po' di pulizia.

2) La struttura è più potente potendo mantenere tutta la storia delle
modifiche a un record e non solo creazione e ultima modifica, ma,
volendo, creazione, elenco di tutte le modifiche e persino eliminazione.

Inoltre quella tabella ha tutti i campi fuori chiave nullabili, ma cosa
rappresenta un record con tutti i campi nulli??
Post by Antonio Budano
CREATE TABLE [dbo].[Configuration] (
[ConfigurationID] [udtConfigurationID] NOT NULL ,
[CreatedOn] [udtDateTime] NULL ,
[CreatedBy] [udtUserID] NULL ,
[ModifiedOn] [udtDateTime] NULL ,
[ModifiedBy] [udtUserID] NULL ,
[ConfigurationObjectID] [udtConfigurationObjectID] NOT NULL ,
[ConfigurationElementValue1] [udtConfigurationElementValue] NOT NULL ,
[ConfigurationElementValue2] [udtConfigurationElementValue] NOT NULL ,
[ConfigurationElementValue3] [udtConfigurationElementValue] NOT NULL ,
[ConfigurationElementValue4] [udtConfigurationElementValue] NOT NULL ,
[ConfigurationElementValue5] [udtConfigurationElementValue] NOT NULL ,
[ConfigurationElementValue6] [udtConfigurationElementValue] NOT NULL ,
[ConfigurationElementValue7] [udtConfigurationElementValue] NOT NULL ,
[ConfigurationElementValue8] [udtConfigurationElementValue] NOT NULL ,
[ConfigurationElementValue9] [udtConfigurationElementValue] NOT NULL ,
[ConfigurationElementValue10] [udtConfigurationElementValue] NOT NULL ,
[ConfigurationElementValue11] [udtConfigurationElementValue] NOT NULL ,
[ConfigurationElementValue12] [udtConfigurationElementValue] NOT NULL ,
[ConfigurationElementValue13] [udtConfigurationElementValue] NOT NULL ,
[ConfigurationElementValue14] [udtConfigurationElementValue] NOT NULL ,
[ConfigurationElementValue15] [udtConfigurationElementValue] NOT NULL
) ON [PRIMARY]
GO
Una piccola stroncatura anche relativamente a questa tabella :-D
Perchè ci sono quei ConfigurationElementValue1/15?? Una configurazione
ha esattamente 15 elementi?? Non taglia un po' le gambe se salta fuori
il 16 elemento? Perchè non fare una classica master/details?

marc.
David
2006-01-04 09:33:26 UTC
Permalink
<Marcello>ha scritto:<Marcello/>
<cut />
<quote>L'architettura va pensata per accogliere al meglio la logica dei dati
e non per rispondere a questioni di interfaccia.</quote>
<imho>E' uno degli errori più comuni nel disegno di un database.</imho>
Antonio Budano
2006-01-04 13:50:03 UTC
Permalink
Ciao,
Post by Marcello
6 campi per una chiave e [forse] tutti GUID! Spero tu sia consapevole
che se quella chiave è anche cluster ogni indice si porta dietro un
fardello 96 byte solo per le informazioni di chiave e che ogni relazione
richiede altrettanto spazio!
Non sarebbe il caso di definire una chiave su un surrogato del tipo
MaterialStockID e definire un vincolo univoco sui sei campi?
E' solo il campo ConfigurationID di tipo GUID che è definito di tipo
varchar(36), complessivamente la chiave è lunga 76 carateri. Faccio così in
quanto lo genero nel programma, lo uso per popolare i dataset e poi lo scrivo
nel DB.
L'idea di gestire una chiave di tipo MaterialStockID potrebbe aiutare, mi
indichi dove posso trovare informazioni sulle differenze tra usare una
primary key con sei campi e una con un campo mettendo i vincoli sui campi
"chiave"? Sai ho un backgroud di DLI/VSAM/ dove non esistevano GUID ;-)
Post by Marcello
Questa tabella è molto ben scritta con una chiarissima naming convention
e tutti i tipi dati definiti per bene come User Data Types [in un modo
che a me appare francamente addirittura eccessivo :-D ]
:-):-):-)
Post by Marcello
Anzitutto ha tutta l'aria di essere una tabella di riepiloghi e io sono
radicalmente contrario a queste strutture
Non si tratta di una tabella di riepilogo ma della tabella che contiene lo
stock di magazzino del materiale, con solo i riferimenti alle quantità dei
periodi precedenti e anno precedente (questi ultimi due campi vengono
aggiornati a fine periodo/anno)
Post by Marcello
Inoltre non amo l'appesantimento dovuto alle informazioni di log
[CreatedOn, CreatedBy...]. Grazie all'univocità a livello di db [e
superiore] dei GUID, questo tipo dato permette di creare strutture del tipo
create table t_Log(RecordID uniqueidentifier,Date datetime,User
uniqeidentifier)
E in questa tabella archiviare tutte le informazioni di modifica di
1) Si tratta di una struttura denormalizzata poichè RecordID è
virtualmente relazionata a ogni tabella del db e quindi andrà in contro
a casi di non integrità dei dati. Personalmente la cosa non mi tocca,
data la natura delle informazioni e periodicamente faccio un po' di pulizia.
2) La struttura è più potente potendo mantenere tutta la storia delle
modifiche a un record e non solo creazione e ultima modifica, ma,
volendo, creazione, elenco di tutte le modifiche e persino eliminazione.
Concordo con questa soluzione, il problema è che esiste gia una versione del
programma che è strutturata così per cui dovrei creare un programma di
conversione per spostare i dati log in una tabella di log, valuterò il lavoro
da fare che mi sembra interessante.
Post by Marcello
Inoltre quella tabella ha tutti i campi fuori chiave nullabili, ma cosa
rappresenta un record con tutti i campi nulli??
Post by Antonio Budano
CREATE TABLE [dbo].[Configuration] (
[ConfigurationID] [udtConfigurationID] NOT NULL ,
[CreatedOn] [udtDateTime] NULL ,
[CreatedBy] [udtUserID] NULL ,
[ModifiedOn] [udtDateTime] NULL ,
[ModifiedBy] [udtUserID] NULL ,
[ConfigurationObjectID] [udtConfigurationObjectID] NOT NULL ,
[ConfigurationElementValue1] [udtConfigurationElementValue] NOT NULL ,
[ConfigurationElementValue2] [udtConfigurationElementValue] NOT NULL ,
[ConfigurationElementValue3] [udtConfigurationElementValue] NOT NULL ,
[ConfigurationElementValue4] [udtConfigurationElementValue] NOT NULL ,
[ConfigurationElementValue5] [udtConfigurationElementValue] NOT NULL ,
[ConfigurationElementValue6] [udtConfigurationElementValue] NOT NULL ,
[ConfigurationElementValue7] [udtConfigurationElementValue] NOT NULL ,
[ConfigurationElementValue8] [udtConfigurationElementValue] NOT NULL ,
[ConfigurationElementValue9] [udtConfigurationElementValue] NOT NULL ,
[ConfigurationElementValue10] [udtConfigurationElementValue] NOT NULL ,
[ConfigurationElementValue11] [udtConfigurationElementValue] NOT NULL ,
[ConfigurationElementValue12] [udtConfigurationElementValue] NOT NULL ,
[ConfigurationElementValue13] [udtConfigurationElementValue] NOT NULL ,
[ConfigurationElementValue14] [udtConfigurationElementValue] NOT NULL ,
[ConfigurationElementValue15] [udtConfigurationElementValue] NOT NULL
) ON [PRIMARY]
GO
Una piccola stroncatura anche relativamente a questa tabella :-D
Perchè ci sono quei ConfigurationElementValue1/15?? Una configurazione
ha esattamente 15 elementi?? Non taglia un po' le gambe se salta fuori
il 16 elemento? Perchè non fare una classica master/details?
Eh, eh, eh,
Abbiamo avuto qualche discussione tempo fa a proposito di questo approccio,
mi sembra con te, posso anche sbagliarmi in quanto adesso non sono a casa e
non ho il log sotto mano.
L'approccio master/detail finisce con il costrigermi a usare una soluzione
complessa nel caso in cui volessi dire "Vorrei conoscere lo stock del
materiale di colore = rosso, Lunghezza = 10, ecc.), andando a cercare il
valore corrispondente di ConfigurationID nei vari record di caratteristiche
per poter poi accedere al record dello stock.
La rigidità introdotta nell'avere massimo 15 caratteristiche semplifica
molto la ricerca, considerato che normlmente se ne utilizzeranno 6-7.

Ciao
Antonio
Antonio Budano
2006-01-04 14:05:08 UTC
Permalink
Marcello,
Post by Antonio Budano
Abbiamo avuto qualche discussione tempo fa a proposito di questo approccio,
mi sembra con te, posso anche sbagliarmi in quanto adesso non sono a casa e
non ho il log sotto mano.
scusami ma sto diventando vecchio, comincio a dimenticare le cose:-D

La discussione l'ho avuta con Jeremy Williams su
microsoft.public.sqlserver.programming, cerca il messaggio "Select statement
on multiple values" scritto da me dove si finiva con il fare una reletional
division che mi complicava la vita.

Ciao
Antonio
Marcello
2006-01-04 16:14:43 UTC
Permalink
Post by Antonio Budano
E' solo il campo ConfigurationID di tipo GUID che è definito di tipo
varchar(36), complessivamente la chiave è lunga 76 carateri.
Beh, fa comunque 76 byte, mi sembra in ogni caso una chiave eccessiva!
Post by Antonio Budano
Faccio così in
quanto lo genero nel programma, lo uso per popolare i dataset e poi lo scrivo
nel DB.
Qui non ti seguo...
Post by Antonio Budano
L'idea di gestire una chiave di tipo MaterialStockID potrebbe aiutare, mi
indichi dove posso trovare informazioni sulle differenze tra usare una
primary key con sei campi e una con un campo mettendo i vincoli sui campi
"chiave"? Sai ho un backgroud di DLI/VSAM/ dove non esistevano GUID ;-)
Se crei un indice sul campo x e la chiave è indice cluster, la struttura
fisica dell'indice conterrà, per ogni record i valori x+chiave, Quindi
un indice [di per se molto performante] su un intero [4 byte] richiede
nel tuo caso 80 byte per record e ha quindi una densità di pagina 10
volte inferiore rispetto a una chiave su intero con conseguenza che il
numero di pagine lette ad ogni scansione sarà mediamente 10 volte più
elevato e [molto approssimativamente] 10 volte più lento.
Post by Antonio Budano
Non si tratta di una tabella di riepilogo ma della tabella che contiene lo
stock di magazzino del materiale, con solo i riferimenti alle quantità dei
periodi precedenti e anno precedente (questi ultimi due campi vengono
aggiornati a fine periodo/anno)
Se però questi dati "vengono aggiornati a fine periodo/anno" da altri
dati del db che non vengono eliminati, sono appunto una tabella
calcolata di riepilogo....
Post by Antonio Budano
Concordo con questa soluzione, il problema è che esiste gia una versione del
programma che è strutturata così per cui dovrei creare un programma di
conversione per spostare i dati log in una tabella di log, valuterò il lavoro
da fare che mi sembra interessante.
Da quel che dici si desume che i client agiscano direttamente sulle
tabelle, se agissero solo su viste e stored la libertà di manipolazione
e di variazione sulla base dati sarebbe molto maggiore e non
iccapperesti in questi cicli paralizzanti [per aggiungere un campo devo
ricompilare il client e rifare il deployment di tutta l'applicazione!]
Post by Antonio Budano
Eh, eh, eh,
Abbiamo avuto qualche discussione tempo fa a proposito di questo approccio,
mi sembra con te, posso anche sbagliarmi in quanto adesso non sono a casa e
non ho il log sotto mano.
L'approccio master/detail finisce con il costrigermi a usare una soluzione
complessa nel caso in cui volessi dire "Vorrei conoscere lo stock del
materiale di colore = rosso, Lunghezza = 10, ecc.), andando a cercare il
valore corrispondente di ConfigurationID nei vari record di caratteristiche
per poter poi accedere al record dello stock.
La rigidità introdotta nell'avere massimo 15 caratteristiche semplifica
molto la ricerca, considerato che normlmente se ne utilizzeranno 6-7.
Mah... ripeto quanto detto prima. Il db deve accogliere opportunamente i
dati, i problemi "successivi" non devono influenzare la costruzione di
una architettura corretta, nulla vieta poi di costruire una vista che
ricrei la denormalizzazione e su cui far basare il client. Poi quando
avrai voglia di riscrivere il client butterai la vista e implementerai
nuove strategie su una base dati duratura e performante.
Post by Antonio Budano
Ciao
Antonio
marc.

Loading...