🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.bazy-danych.msaccess
7 messages
7 total messages Started by Maciej Tokarz Thu, 17 Sep 2015 03:56
Linia czasu zestawu danych
#137002
Author: Maciej Tokarz
Date: Thu, 17 Sep 2015 03:56
41 lines
2340 bytes
Dzień dobry,

Dawno nie pisałem na grupę, zatem czas to naprawić :)
Mój problem jest bardziej teoretyczny jak Accessowy, ale do rzeczy!
Mianowicie zastanawiam się nad rozwiązaniem problemu zapewnienia wstecznej 
autentyczności danych w jednej tabeli - zależnych (będących w relacji) od 
wartości w innej tabeli.

Dane
  PK Id int
  FK ZaleznaWartoscId int
  Utworzono date

ZalezneWartosci
    PK Id int
    Wartosc string

Problem polega na tym, że w ZalezneWartosci może być rekord:
{ Id: 1, Wartosc: “A” }
, który z dniem 2015-10-01 zmieni wartość:
{ Id: 1, Wartosc: “B” }

Jeśli w tabeli Dane będę miał rekordy:
{ Id: 1, ZaleznaWartoscId: 1, Utworzono: 2015-09-01 }
{ Id: 2, ZaleznaWartoscId: 1, Utworzono: 2015-09-02 }
{ Id: ..., ZaleznaWartoscId: 1, Utworzono: ... }
{ Id: 30, ZaleznaWartoscId: 1, Utworzono: 2015-09-30 }

To do dnia 2015-09-30 wszystkie powiązane z ZaleznaWartoscId: 1 rekordy 
faktycznie będą wskazywały na wartość “A”.
Ale w dniu 2015-10-01 i później, powyższe rekordy jak i nowe:
{ Id: 31, ZaleznaWartoscId: 1, Utworzono: 2015-10-01 }
{ Id: 32, ZaleznaWartoscId: 1, Utworzono: 2015-10-02 }
{ Id: 33, ZaleznaWartoscId: 1, Utworzono: 2015-10-02 }
będą wskazywały na wartość “B”.

Pytanie: jakie rozwiązanie wdrożyć, aby rekordy utworzone przed 2015-10-01 
wskazywały na wartość “A”, a te od 2015-10-01 na wartość “B”?

Pozdrawiam,
Maciej 
Re: Linia czasu zestawu danych
#137003
Author: Maciej Tokarz
Date: Thu, 17 Sep 2015 04:03
24 lines
1716 bytes
>Pytanie: jakie rozwiązanie wdrożyć, aby rekordy utworzone przed 2015-10-01 
>wskazywały na wartość “A”, a te od 2015-10-01 na wartość “B”?

Jednym ze sposobów jaki przychodzi mi na myśl to rozszerzenie klucza w 
tabeli ZalezneWartosci:
  PK Id int
  PK Wersja int
  Wartosc string
o wersję:
{ Id: 1, Wersja: 1, Wartosc: “A” }
{ Id: 1, Wersja: 2, Wartosc: “B” }
i zapisywanie informacji w takiej rozszerzonej formie:
Dane
  PK Id int
  FK ZaleznaWartoscId int
  FK ZaleznaWartoscWersja int
  Utworzono date
rekord wyglądał by tak:
{ Id: 1, ZaleznaWartoscId: 1, ZaleznaWartoscWersja: 1, Utworzono: 
2015-09-01 }
{ Id: 1, ZaleznaWartoscId: 1, ZaleznaWartoscWersja: 2, Utworzono: 
2015-10-01 }

M.
Re: Linia czasu zestawu danych
#137004
Author: Maciej Tokarz
Date: Thu, 17 Sep 2015 05:40
43 lines
2541 bytes
Kolejny sposób, w którym można kontrolować moment wdrożenia nowych wartości:

ZalezneWartosci:
  PK Id int
  PK DataOd date
  DataDo date null
  Wartosc string

{ Id: 1, DataOd: 2015-09-01, DataDo: 2015-09-30, Wartosc: “A” }
{ Id: 2, DataOd: 2015-09-01, DataDo: 2015-09-30, Wartosc: “A1” }
{ Id: 3, DataOd: 2015-09-01, DataDo: 2015-09-30, Wartosc: “A2” }
{ Id: 1, DataOd: 2015-10-01, DataDo: null, Wartosc: “B” }
{ Id: 2, DataOd: 2015-10-01, DataDo: null, Wartosc: “A1” }
{ Id: 3, DataOd: 2015-10-01, DataDo: null, Wartosc: “B2” }

Dane
  PK Id int
  FK ZaleznaWartoscId int
  FK ZaleznaWartoscDataOd date
  Utworzono date

{ Id: 1, ZaleznaWartoscId: 1, ZaleznaWartoscDataOd: 2015-09-01, Utworzono: 
2015-09-01 }
{ Id: 2, ZaleznaWartoscId: 2, ZaleznaWartoscDataOd: 2015-09-01, Utworzono: 
2015-09-01 }
{ Id: 3, ZaleznaWartoscId: 1, ZaleznaWartoscDataOd: 2015-09-01, Utworzono: 
2015-09-01 }
{ Id: 4, ZaleznaWartoscId: 1, ZaleznaWartoscDataOd: 2015-09-01, Utworzono: 
2015-09-01 }
{ Id: 5, ZaleznaWartoscId: 2, ZaleznaWartoscDataOd: 2015-10-01, Utworzono: 
2015-10-01 }
{ Id: 6, ZaleznaWartoscId: 1, ZaleznaWartoscDataOd: 2015-10-01, Utworzono: 
2015-10-01 }
{ Id: 7, ZaleznaWartoscId: 1, ZaleznaWartoscDataOd: 2015-10-01, Utworzono: 
2015-10-01 }

Skomplikowane to jest, ale powinno zadziałać.
Obowiązującym zestawem będzie ten, którego DataDo będzie null.
Dodatkowo mogę powielać ZależneWartosciId na czym mi zależy...
Może jeszcze jakiś sposób jest?
Przy okazji dziękuję GDN za pomoc :)

M. 
Re: Linia czasu zestawu danych
#137005
Author: Maciej Tokarz
Date: Thu, 17 Sep 2015 05:53
43 lines
2311 bytes
I jeszcze jeden wariant (aby lepiej zobrazować dodałem pole 
JakasStalaWartosc):

ZalezneWartosci:
  PK Id int
  JakasStalaWartosc string

  { Id: 1,  JakasStalaWartosc: "X"}
  { Id: 2,  JakasStalaWartosc: "Y"}
  { Id: 3,  JakasStalaWartosc: "Z"}

HistoriaWartosci
  FK ZalezneWartosciId int
  PK DataOd date
  DataDo null
  Wartosc string

{ ZalezneWartosciId: 1, DataOd: 2015-09-01, DataDo: 2015-09-30, Wartosc: 
“A” }
{ ZalezneWartosciId: 2, DataOd: 2015-09-01, DataDo: 2015-09-30, Wartosc: 
 “A1” }
{ ZalezneWartosciId: 3, DataOd: 2015-09-01, DataDo: 2015-09-30, Wartosc: 
 “A2” }
{ ZalezneWartosciId: 1, DataOd: 2015-10-01, DataDo: null, Wartosc: “B” }
{ ZalezneWartosciId: 2, DataOd: 2015-10-01, DataDo: null, Wartosc: “A1” }
{ ZalezneWartosciId: 3, DataOd: 2015-10-01, DataDo: null, Wartosc: “B2” }

Dane
  PK Id int
  FK ZaleznaWartoscId int
  Utworzono date

{ Id: 1, ZaleznaWartoscId: 1, Utworzono: 2015-09-01 }
{ Id: 2, ZaleznaWartoscId: 2, Utworzono: 2015-09-01 }
{ Id: 3, ZaleznaWartoscId: 1, Utworzono: 2015-09-01 }
{ Id: 4, ZaleznaWartoscId: 1, Utworzono: 2015-09-01 }
{ Id: 5, ZaleznaWartoscId: 2, Utworzono: 2015-10-01 }
{ Id: 6, ZaleznaWartoscId: 1, Utworzono: 2015-10-01 }
{ Id: 7, ZaleznaWartoscId: 1, Utworzono: 2015-10-01 }

Chyba najbardziej elastyczne :)

M. 
Re: Linia czasu zestawu danych
#137006
Author: Maciej Tokarz
Date: Thu, 17 Sep 2015 07:56
9 lines
1129 bytes
Drobna korekta:

HistoriaWartosci
>PK ZalezneWartosciId int
  PK DataOd date
  DataDo date null
  Wartosc string

M.
Re: Linia czasu zestawu danych
#137007
Author: Smyk
Date: Thu, 17 Sep 2015 08:59
44 lines
2243 bytes
Maciej Tokarz wrote at Do 17.09.2015 05:56:

Cześć Maciek,

trochę kombinujesz z tą relacją 1:n ;) Jeśli zaprojektowałeś model danych
z taką relacją to niestety konsekwencją jej jest, że po zmianie strony 1 
relacji, wszystkie zależne rekordy otrzymają aktualną wartość. Jeśli 
potrzebne są dwie różne zależne wartości, to dlaczego nie utwożysz w tabeli
"ZależneWartosci" nowego rekordu z wartościa "B" i używasz go od dnia 
2015-10-01 dla nowych rekordów w tabeli "Dane" ?

Ale jeśli już musiałbym kombinować, wybrałbym chyba wariant:

> Dane
>   PK Id int
>   FK ZaleznaWartoscId int
>   Utworzono date
> 
> ZalezneWartosci
>     PK Id int
> 

WartosciZalezneOdCzasu
   PK Id int
   FK ZalezneWartosciId int
   Od data
   Do data
   Wartosc string

albo bez redundancji

WartosciZalezneOdCzasu
   ZalezneWartosciId int
   Od data
   Do data
   Wartosc string
   PK(ZalezneWartosciId, Od, Do)

Czy musi byc "Od" i "Do", czy wystarczy jeden attrubut zdecyduj sam.

W ten sposób możesz w kwerendzie przez parametr, powiedzmy "kiedy" wpływać 
na to jaka wartość zostanie pokazana dla rekordów z tabeli Dane.

Ciao, Smyk
Re: Linia czasu zestawu danych
#137009
Author: Maciej Tokarz
Date: Thu, 17 Sep 2015 21:29
95 lines
4328 bytes
Witaj!

Tak to jest jak się kombinuje przed poranną kawką ;-)
Wybrałem wariant jak poniżej (przepraszam, że zaśmiecę grupę inną składnią).
Generalnie co ważne, a również podkreśliłeś, mam możliwość kontrolowania momentu wdrożenia określonej wartości:

public sealed class Shift
    {
        [DatabaseGenerated(DatabaseGeneratedOption.None)]
        public int Id { get; set; }

        public int Alias { get; set; }

        [StringLength(5)]
        public string Sign { get; set; }
        
        public bool IsValid { get; set; }
    }


public sealed class ShiftValue
    {
        [Key]
        [Column(Order = 0)]
        [DatabaseGenerated(DatabaseGeneratedOption.None)]
        public int ShiftId { get; set; }

        [Key]
        [Column(Order = 1, TypeName = "date")]
        public DateTime ValidFrom { get; set; }

        [Column(TypeName = "date")]
        public DateTime? ValidTo { get; set; }

        public TimeSpan Start { get; set; }

        public TimeSpan Finish { get; set; }

        public Guid CreatedBy { get; set; }

        [Column(TypeName = "smalldatetime")]
        public DateTime Created { get; set; }

        public Shift Shift { get; set; }
    }

i przykład wykorzystania:

var shiftValue = ShiftValuesSource.First(x => x.ShiftId == id && D >= x.ValidFrom && D <= (x.ValidTo ?? DateTime.MaxValue));
var s = shiftValue.Start;
var f = shiftValue.Finish;

Dane wyglądają tak:

context.Shifts.AddOrUpdate(x => x.Id,
                new Shift()
                {
                    Id = 1,
                    Alias = 76,
                    Sign = "I",
                    IsValid = true
                },
                new Shift()
                {
                    Id = 2,
                    Alias = 77,
                    Sign = "II",
                    IsValid = true
                },

            context.ShiftValues.AddOrUpdate(x => x.ValidFrom,
                new ShiftValue()
                {
                    ShiftId = 1,
                    ValidFrom = new DateTime(2013,1,1),
                    ValidTo = null,
                    Start = new TimeSpan(6, 0, 0),
                    Finish = new TimeSpan(14, 0, 0),
                    CreatedBy = new Guid("87ef9940-af60-4002-9944-012a930148b5"),
                    Created = new DateTime(2015, 3, 21)
                },
                new ShiftValue()
                {
                    ShiftId = 2,
                    ValidFrom = new DateTime(2013, 1, 1),
                    ValidTo = null,
                    Start = new TimeSpan(14, 0, 0),
                    Finish = new TimeSpan(22, 0, 0),
                    CreatedBy = new Guid("87ef9940-af60-4002-9944-012a930148b5"),
                    Created = new DateTime(2015, 3, 21)
                },

Widzę, że nie tylko ja śledzę grupę :)
Serdecznie pozdrawiam,
Maciej
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads