簡體   English   中英

如何在“標准化”中跟蹤更改並存儲計算的內容?

[英]How do I track changes and store calculated content in Nermalization?

我正在嘗試創建一個像這樣的表:

lives_with_owner_no from    until   under_the_name
1                   1998    2002    1
3                   2002    NULL    1
2                   1997    NULL    2
3                   1850    NULL    3
3                   1999    NULL    4
2                   2002    2002    4
3                   2002    NULL    5

這是Nermalization的示例 ,我猜它很受歡迎。

無論如何,我想我只是應該在MySQL中為from lives_with表或cat_name表的更改掛起建立依賴關系,然后在untilfrom列之間建立依賴關系。 我認為所有者可能想來更新貓的信息,並覆蓋“發件人”列,所以我必須使用PHP? 有什么特殊的方法可以對覆蓋進行時間戳記(例如, $date = date("Ymd H:i:s"); )? 如何在MySQL中設置依賴關系?

我也有一個可以通過將其他列加在一起生成的列。 我想用貓的例子,它看起來像:

combined_family_age family_name
75                  Alley
230                 Koneko
132                 Furrdenand
1,004               Whiskers

我應該通過PHP添加,然后通過查詢輸入值,還是應該使用MySQL管理添加? 我是否應該為此使用特殊的引擎,例如MemoryAll?

我從兩個方面不同意這個神經化的例子。

  1. 最終沒有貓的實體。 相反,存在一個關系(cat_name_no,cat_name),在您的示例中,它具有直接的后果,即您無法知道存在多少只名為Lara的貓。 這是很容易避免的異常。
  2. 該表將兩個關系(lives_with_owner和under_the_name)填充到一個表中。 這不是一個好主意,尤其是在數據是臨時數據的情況下,因為它會產生各種令人討厭的異常情況。 相反,您應該為每個表使用一個表。

我將如下設計該數據庫:

create table owner (id integer not null primary key, name varchar(255));
create table cat (id integer not null primary key, current_name varchar(255));
create table cat_lives_with (
  cat_id integer references cat(id),
  owner_id integer references owner(id),
  valid_from date,
  valid_to date);
create table cat_has_name (
  cat_id integer references cat(id),
  name varchar(255),
  valid_from date,
  valid_to date);

因此,您將獲得如下數據:

id | name 
 1 | Andrea
 2 | Sarah
 3 | Louise

id | current_name
 1 | Ada
 2 | Shelley

cat_id | owner_id | valid_from | valid_to
     1 |        1 | 1998-02-15 | 2002-08-11
     1 |        3 | 2002-08-12 | 9999-12-31
     2 |        2 | 2002-01-08 | 2001-10-23
     2 |        3 | 2002-10-24 | 9999-12-31

cat_id | name     | valid_from | valid_to
     1 | Ada      | 1998-02-15 | 9999-12-31
     2 | Shelley  | 2002-01-08 | 2001-10-23
     2 | Callisto | 2002-10-24 | 9999-12-31

我將使用比年份更精細的日期類型(在具有2002-2002作為范圍的精確化示例中,實際上可能導致凌亂的查詢語法),因此您可以select cat_id from owner where '2000-06-02' between valid_from and valid_to查詢諸如select cat_id from owner where '2000-06-02' between valid_from and valid_to類的查詢select cat_id from owner where '2000-06-02' between valid_from and valid_to 至於在一般情況下如何處理時態數據的問題:Richard Snodgrass撰寫了一本非常出色的書,主題是“在SQL中開發面向時間的數據庫應用程序”(Richard Snodgrass 發行的免費全文PDF ),我相信甚至可以合法地以pdf格式下載,Google會為您提供幫助。

您的另一個問題:您可以在sql的外部或如果需要經常使用該列的情況下,在sql中使用視圖來處理Combined_family_age。 但是,您不應該手動管理內容,而是讓數據庫為您計算內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM