|
|
Subject: .. ancora su indicizzazione tabelle!
From: Sy
Date: 5/2/2007 11:12:37 AM
Ciao amici, mi serve un consiglio.
Nel progetto che sto sviluppando, ho una tabella principale con n tabelle ad
essa collegate.
Posto sotto la princiapale e **alcune** delle subordinate.
Deciso che le prestazioni in fase di inserimento possono essere tralasciate,
a discapito di quelle in fase di lettura ecco come indicizzerei io il db ...
Accetto tutti i consigli possibili !!!!
Grazie mille
Simone
--//////////////////////////////////////////////////////////////////////////////////////
-- PRINCIPALE
--//////////////////////////////////////////////////////////////////////////////////////
CREATE TABLE [dbo].[RisorseCasaImmobile](
[IDImmobile] [int] IDENTITY(1,1) NOT NULL,
[IDAgenzia] [int] NULL,
[RiferimentoImmobile] [varchar](10) COLLATE Latin1_General_CI_AS NULL,
[IDProvincia] [int] NULL,
[IDTipologia] [int] NULL,
[IDCategoria] [int] NULL,
[IDContratto] [int] NULL,
[IDComune] [int] NULL,
[Zona] [varchar](50) COLLATE Latin1_General_CI_AS NULL,
[Indirizzo] [varchar](50) COLLATE Latin1_General_CI_AS NULL,
[Mq] [int] NULL,
[NumLocali] [int] NULL,
[NumServizi] [int] NULL,
[Prezzo] [money] NULL,
[DescrizioneIta] [ntext] COLLATE Latin1_General_CI_AS NULL,
[DescrizioneEng] [ntext] COLLATE Latin1_General_CI_AS NULL,
[DescrizioneTed] [ntext] COLLATE Latin1_General_CI_AS NULL,
[Foto1] [varchar](50) COLLATE Latin1_General_CI_AS NULL,
[Foto2] [varchar](50) COLLATE Latin1_General_CI_AS NULL,
[Foto3] [varchar](50) COLLATE Latin1_General_CI_AS NULL,
[Foto4] [varchar](50) COLLATE Latin1_General_CI_AS NULL,
CONSTRAINT [PK_RisorseCasaImmobile] PRIMARY KEY CLUSTERED
(
[IDImmobile] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
ALTER TABLE [dbo].[RisorseCasaImmobile] WITH CHECK ADD CONSTRAINT
[FK_RisorseCasaImmobile_RisorseCasaComuni] FOREIGN KEY([IDComune])
REFERENCES [dbo].[RisorseCasaComuni] ([IDComune])
GO
ALTER TABLE [dbo].[RisorseCasaImmobile] CHECK CONSTRAINT
[FK_RisorseCasaImmobile_RisorseCasaComuni]
GO
ALTER TABLE [dbo].[RisorseCasaImmobile] WITH CHECK ADD CONSTRAINT
[FK_RisorseCasaImmobile_RisorseCasaContratto] FOREIGN KEY([IDContratto])
REFERENCES [dbo].[RisorseCasaContratto] ([IDContratto])
GO
ALTER TABLE [dbo].[RisorseCasaImmobile] CHECK CONSTRAINT
[FK_RisorseCasaImmobile_RisorseCasaContratto]
GO
ALTER TABLE [dbo].[RisorseCasaImmobile] WITH CHECK ADD CONSTRAINT
[FK_RisorseCasaImmobile_RisorseCasaProvince] FOREIGN KEY([IDProvincia])
REFERENCES [dbo].[RisorseCasaProvince] ([IDProvincia])
GO
ALTER TABLE [dbo].[RisorseCasaImmobile] CHECK CONSTRAINT
[FK_RisorseCasaImmobile_RisorseCasaProvince]
GO
ALTER TABLE [dbo].[RisorseCasaImmobile] WITH CHECK ADD CONSTRAINT
[FK_RisorseCasaImmobile_RisorseCasaTipologia] FOREIGN KEY([IDTipologia])
REFERENCES [dbo].[RisorseCasaTipologia] ([IDTipologia])
GO
ALTER TABLE [dbo].[RisorseCasaImmobile] CHECK CONSTRAINT
[FK_RisorseCasaImmobile_RisorseCasaTipologia]
--//////////////////////////////////////////////////////////////////////////////////////
-- SUBORDINATA 1
--//////////////////////////////////////////////////////////////////////////////////////
CREATE TABLE [dbo].[RisorseCasaTipologia](
[IDTipologia] [int] IDENTITY(1,1) NOT NULL,
[Tipologia] [varchar](50) COLLATE Latin1_General_CI_AS NULL,
CONSTRAINT [PK_RisorseCasaTipologia] PRIMARY KEY CLUSTERED
(
[IDTipologia] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
--//////////////////////////////////////////////////////////////////////////////////////
-- SUBORDINATA 2
--//////////////////////////////////////////////////////////////////////////////////////
CREATE TABLE [dbo].[RisorseCasaContratto](
[IDContratto] [int] IDENTITY(1,1) NOT NULL,
[Contratto] [varchar](50) COLLATE Latin1_General_CI_AS NULL,
CONSTRAINT [PK_RisorseCasaContratto] PRIMARY KEY CLUSTERED
(
[IDContratto] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
Subject: .. ancora su indicizzazione tabelle!
From: Sy
Date: 5/2/2007 11:52:36 AM
Ciao Marcello,
le tue puntualizzazioni inerenti i campi descrizione e foto + NULL sono
perfette e come tali
provvederò alla modifica ;)
Piuttosto mi rimane il dubbio di come strutturare nella tabella Immobili il
concetto: un immobile appartiene ad un comune il quale fa parte di una
provincia che a sua volta è una regione.
Al momento la relazione comune provincia regione le ho strutturate così :
CREATE TABLE [dbo].[RisorseCasaRegioni](
[IDRegione] [int] IDENTITY(1,1) NOT NULL,
[Regione] [varchar](50) COLLATE Latin1_General_CI_AS NULL,
CONSTRAINT [PK_RisorseCasaRegioni] PRIMARY KEY CLUSTERED
(
[IDRegione] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
CREATE TABLE [dbo].[RisorseCasaProvince](
[IDProvincia] [int] IDENTITY(1,1) NOT NULL,
[Provincia] [varchar](50) COLLATE Latin1_General_CI_AS NULL,
[IDRegione] [int] NULL,
[Sigla] [char](2) COLLATE Latin1_General_CI_AS NULL,
CONSTRAINT [PK_RisorseCasaProvince] PRIMARY KEY CLUSTERED
(
[IDProvincia] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
ALTER TABLE [dbo].[RisorseCasaProvince] WITH CHECK ADD CONSTRAINT
[FK_RisorseCasaProvince_RisorseCasaRegioni] FOREIGN KEY([IDRegione])
REFERENCES [dbo].[RisorseCasaRegioni] ([IDRegione])
GO
ALTER TABLE [dbo].[RisorseCasaProvince] CHECK CONSTRAINT
[FK_RisorseCasaProvince_RisorseCasaRegioni]
CREATE TABLE [dbo].[RisorseCasaComuni](
[IDComune] [int] IDENTITY(1,1) NOT NULL,
[Comune] [varchar](50) COLLATE Latin1_General_CI_AS NULL,
[IDProvincia] [int] NULL,
CONSTRAINT [PK_RisorseCasaComuni] PRIMARY KEY CLUSTERED
(
[IDComune] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
ALTER TABLE [dbo].[RisorseCasaComuni] WITH CHECK ADD CONSTRAINT
[FK_RisorseCasaComuni_RisorseCasaProvince] FOREIGN KEY([IDProvincia])
REFERENCES [dbo].[RisorseCasaProvince] ([IDProvincia])
GO
ALTER TABLE [dbo].[RisorseCasaComuni] CHECK CONSTRAINT
[FK_RisorseCasaComuni_RisorseCasaProvince]
certo è che la ricerca avviene in molteplici modi esempio:
tutti gli immobili di un comune, oppure di una provincia e a loro volta con
fitro sul prezzo, piuttosto che sulla tipologia...
a quasto punto non conviene inserire nella tabella Immobili i riferimenti
alla PK delle tabelle region, provincia, comune oppure mettere conviene
metterle in ogni volta?????
Grazie mille
Simone
"Marcello" <marcello.poletti@epomops.it> ha scritto nel messaggio
news:59r42qF2lqtqgU3@mid.individual.net...
> Sy ha scritto:
>> Ciao amici, mi serve un consiglio.
>
> Ciao Simone,
>
>> Nel progetto che sto sviluppando, ho una tabella principale con n tabelle
>> ad essa collegate.
>> Posto sotto la princiapale e **alcune** delle subordinate.
>
> Ok.
>
>> Deciso che le prestazioni in fase di inserimento possono essere
>> tralasciate,
>> a discapito di quelle in fase di lettura ecco come indicizzerei io il db
>> ...
>> Accetto tutti i consigli possibili !!!!
>
> Vediamo :-D
>
>> CREATE TABLE [dbo].[RisorseCasaImmobile](
>> [IDImmobile] [int] IDENTITY(1,1) NOT NULL,
>> [IDAgenzia] [int] NULL,
>> [RiferimentoImmobile] [varchar](10) COLLATE Latin1_General_CI_AS NULL,
>> [IDProvincia] [int] NULL,
>> [IDTipologia] [int] NULL,
>> [IDCategoria] [int] NULL,
>> [IDContratto] [int] NULL,
>> [IDComune] [int] NULL,
>
> ...mmm... ID_Comune e ID_Provincia sulla stessa tabella? Ha un senso o
> soono forzati dall'esterno ad essere coerenti? Se si, molto meglio:
>
> CREATE TABLE [dbo].[RisorseCasaImmobile](
> ...
> [IDComune] [int] NULL,
>
> CREATE TABLE [dbo].[Comuni](
> [IDComune] [int] NULL,
> [ID_Provincia] ... [!!!!!]
>
>> [DescrizioneIta] [ntext] COLLATE Latin1_General_CI_AS NULL,
>> [DescrizioneEng] [ntext] COLLATE Latin1_General_CI_AS NULL,
>> [DescrizioneTed] [ntext] COLLATE Latin1_General_CI_AS NULL,
>
> Occhio alla scalabilità. Un'estensione al francese richiede modifiche
> strutturali! Meglio tabelle derivate.
>
>> [Foto1] [varchar](50) COLLATE Latin1_General_CI_AS NULL,
>> [Foto2] [varchar](50) COLLATE Latin1_General_CI_AS NULL,
>> [Foto3] [varchar](50) COLLATE Latin1_General_CI_AS NULL,
>> [Foto4] [varchar](50) COLLATE Latin1_General_CI_AS NULL,
>
> Come sopra, e la quinta foto?
> Inoltre, complessivamente, è tutto nullable, male! :-D
>
>> CONSTRAINT [PK_RisorseCasaImmobile] PRIMARY KEY CLUSTERED
>> (
>> [IDImmobile] ASC
>> )WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
>> ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
>
> Ok, pk e cluster sul surrogato.
>
>> ALTER TABLE [dbo].[RisorseCasaImmobile] WITH CHECK ADD CONSTRAINT
>> [FK_RisorseCasaImmobile_RisorseCasaComuni] FOREIGN KEY([IDComune])
>> REFERENCES [dbo].[RisorseCasaComuni] ([IDComune])
>> [CUT]
>
> Ok, tutte le relazioni del caso.
>
>> CREATE TABLE [dbo].[RisorseCasaTipologia](
>> [IDTipologia] [int] IDENTITY(1,1) NOT NULL,
>> [Tipologia] [varchar](50) COLLATE Latin1_General_CI_AS NULL,
>> CONSTRAINT [PK_RisorseCasaTipologia] PRIMARY KEY CLUSTERED
>> (
>> [IDTipologia] ASC
>> )WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
>> ) ON [PRIMARY]
>
> Non ci va un vincolo univoco su Tipologia? Possono esistere 2 tipologie
> identiche?
>
>> --////////////////////////////////////////////////////////////////////////////////
//////
>> -- SUBORDINATA 2
>> --////////////////////////////////////////////////////////////////////////////////
//////
>> CREATE TABLE [dbo].[RisorseCasaContratto](
>> [IDContratto] [int] IDENTITY(1,1) NOT NULL,
>> [Contratto] [varchar](50) COLLATE Latin1_General_CI_AS NULL,
>> CONSTRAINT [PK_RisorseCasaContratto] PRIMARY KEY CLUSTERED
>> (
>> [IDContratto] ASC
>> )WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
>> ) ON [PRIMARY]
>
> Come sopra relativamente a Contratto.
> ...mmm... e che pareri vorresti sull'indicizzazione? Non ci sono indici a
> parte i cluster sui surrogati che naturalmente vanno benone :-D
>
> marc.
>
> --
> Marcello Poletti
> Dingo&Epomops
> Microsoft MVP - SQL Server
> http://www.dingoepomops.it
> http://blogs.dotnethell.it/epomops/
Subject: .. ancora su indicizzazione tabelle!
From: Sy
Date: 5/3/2007 9:28:05 AM
>"Marcello" <marcello.poletti@epomops.it> ha scritto nel messaggio
>news:59ra0bF2lqtqgU5@mid.individual.net...
>[CUT]
Ciao Marcello,
apprezzo infinitamente la lezione che mi hai impartito, e sono
immediatamente corso a correggere le tabelle così come hai detto tu.
Quindi lasciando da parte il nameconvention per il momento questo è il
risultato della tabella es province:
CREATE TABLE [dbo].[RisorseCasaProvince](
[IDProvincia] [int] IDENTITY(1,1) NOT NULL,
[Provincia] [varchar](50) COLLATE Latin1_General_CI_AS ** NOT NULL **,
[IDRegione] [int] ** NOT NULL **,
[Sigla] [char](2) COLLATE Latin1_General_CI_AS NULL,
CONSTRAINT [PK_RisorseCasaProvince] ** PRIMARY KEY CLUSTERED **
(
[IDProvincia] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
ALTER TABLE [dbo].[RisorseCasaProvince] WITH CHECK ADD CONSTRAINT
[FK_RisorseCasaProvince_RisorseCasaRegioni] FOREIGN KEY([IDRegione])
REFERENCES [dbo].[RisorseCasaRegioni] ([IDRegione])
ALTER TABLE [dbo].[RisorseCasaProvince] CHECK CONSTRAINT
[FK_RisorseCasaProvince_RisorseCasaRegioni]
** CREATE UNIQUE NONCLUSTERED INDEX [IX_RisorseCasaProvince] ON
[dbo].[RisorseCasaProvince] **
(
[Provincia] ASC
)WITH (PAD_INDEX = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF,
IGNORE_DUP_KEY = OFF, ONLINE = OFF) ON [PRIMARY]
** ALTER TABLE [dbo].[RisorseCasaProvince] ADD CONSTRAINT
[PK_RisorseCasaProvince] PRIMARY KEY **CLUSTERED
(
[IDProvincia] ASC
)WITH (PAD_INDEX = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE
= OFF) ON [PRIMARY]
Confermi????
Se questo è ok mi volevo soffermate sulla tabellla immobili, mi sorge una
domanda. Se per motivi di normalizzazione è sempre preferibile non
aggiungere le informazioni della regione, provincia e comune cosa metto
delle tre??? Penso che sia indispensabile il riferimento con il comune dal
moomento che dato questo, posso risalire alla provincia e alla regione ??
Giusto?
Grazie mille
Simone
|