Serie storiche e utenti unici

3

Ho bisogno di raccogliere dati utente ogni pochi secondi in cui ogni utente è unico. Ho svolto alcune ricerche e ho concluso che dovrei considerare i miei dati come dati serie storiche perché sto osservando come il comportamento degli utenti cambia nel tempo. Voglio usare DynamoDB e nel suo best practice per le serie temporali doc, descrive la creazione di una nuova tabella per ogni giorno, ora, minuto, a seconda della convenienza. Nelle tabelle di esempio illustrate nell'articolo, la chiave di partizione è l'intervallo della nuova tabella (ad esempio la data) mentre la chiave di ordinamento è un intervallo più piccolo all'interno di esso (ad esempio secondi).

Ciò di cui sono confuso è come implementare ID utente univoci nel database poiché ritengo che ogni query effettuata sarà basata sull'utente a cui sono destinati i dati. Sarebbe saggio utilizzare un indice secondario che includa l'id utente come chiave primaria o di ordinamento?

    
posta rafvasq 23.05.2018 - 17:44
fonte

2 risposte

2

Come altri hanno già detto, penso che tu ti stia confondendo su dove l'ID utente debba essere unico. Nella sua forma più semplice avrei 2 tavoli.

  1. Una tabella per gli utenti in cui il proprio ID utente è univoco
  2. Una tabella per le serie temporali. (dove viene ripetuto l'id utente).

Di seguito è riportato un esempio di testo creato che verrà eseguito sul server SQL per illustrare il punto.

CREATE TABLE [dbo].[User](
    [UserId] [int] IDENTITY(1,1) NOT NULL,
    [UserName] varchar(50), 
     ) 

CREATE TABLE [dbo].[TimeSeries](
    [TSidx] [int] IDENTITY(1,1) NOT NULL,
    [UserId] int, 
    [DT] [datetime] NULL,
    [Val] float ) 

insert into [User] ([UserName]) Values ('Jim') 
insert into [User] ([UserName]) Values ('Bob') 

select * from [User] 

- Esegui questi di seguito alcune volte ciascuno

insert into [TimeSeries] ([UserId], [DT], [Val]) select [UserId], getdate(), Rand() from [User] where [UserName] = 'Jim'
insert into [TimeSeries] ([UserId], [DT], [Val]) select [UserId], getdate(), Rand() from [User] where [UserName] = 'Bob'

Select * from [TimeSeries]

Le colonne di identità in SQL dovrebbero essere univoche, ma è possibile applicarla definendo ciascuna come chiave primaria.

Alter table [User] add constraint Userpkey primary key ([UserId])
Alter table [TimeSeries] add constraint TSpkey primary key ([TSidx])

Se lo fai, puoi applicare la relazione tra le 2 tabelle utilizzando un vincolo di chiave esterna .

Alter table [TimeSeries] add foreign key ([UserId]) references [User]([UserId]); 

Ciò fermerebbe un record inserito nella tabella TimeSeries a meno che l'ID utente esistesse nella tabella Users.

    
risposta data 11.06.2018 - 07:06
fonte
1

ID utente univoci non hanno senso nei dati delle serie temporali, dal momento che un utente con un particolare ID può apparire più di una volta in un periodo di tempo.

Potresti voler vincolare l'ID utente nelle tabelle delle serie temporali per essere una chiave esterna in una tabella Utente.

    
risposta data 23.05.2018 - 19:25
fonte

Leggi altre domande sui tag