2011-05-14 64 views
6

我正在構建用於分類數據的此工具。基本上,我會定期接收平面文件數據的行看起來像這樣:關於數據庫結構的意見和建議

a:b:c:d:e 
a:b:c:d:e 
a:b:c:d:e 
a:b:c:d:e 

而且我有一個類別列表最多打破這些行插入,例如:

Original Cat1 Cat2 Cat3 Cat4 Cat5 
--------------------------------------- 
a:b:c:d:e a  b  c  d  e 

從第二個角度來看,類別名稱是已知的,以及用於分類數據的類別數量。但是這可能會隨着時間的推移而變化(例如,添加/刪除的類別......更改的類別總數)。

好吧,所以我並不是真的在尋求幫助來解析行或將數據導入數據庫或其他任何東西......我知道如何做到這一點,並且核心腳本已經大部分已經寫好了,以便處理分析值的行並將其分成可變數量的類別。

大多數情況下,我正在尋找關於如何構建我的數據庫來存儲這些東西的建議。所以我一直在想這件事,這就是我想出了:

Table: Generated 
generated_id  int   - unique id for each row generated 
generated_timestamp datetime  - timestamp of when row was generated 
last_updated  datetime  - timestamp of when row last updated 
generated_method varchar(6) - method in which row was generated (manual or auto) 
original_string  varchar (255) - the original string 

Table: Categories 
category_id   int   - unique id for category 
category_name  varchar(20) - name of category 

Table: Category_Values 
category_map_id  int   - unique id for each value (not sure if I actually need this) 
category_id   int   - id value to link to table Categories 
generated_id  int   - id value to link to table Generated 
category_value  varchar (255) - value for the category 

基本的想法是,當我分析一排,我將插入一個新的進入表Generated,以及X項在表Category_Values,其中X是目前有很多類別。類別名稱存儲在另一個表Categories中。

我的腳本將立即執行的操作是處理原始值行並將生成的類別值輸出到新文件以發送到某處。但後來我有了這個數據庫來存儲生成的數據,以便我可以創建另一個腳本,在那裏我可以搜索並列出以前生成的值,或使用新值或其他值更新以前生成的條目。

這看起來像一個好的數據庫結構嗎?任何明顯的我失蹤或潛在地嘲笑我自己?例如,通過這種結構......呃......我不是一個SQL專家,但我想我應該能夠做到像

select * from Generated where original_string = '$string' 
// id is put into $id 

然後

select * from Category_Values where generated_id = '$id' 

...然後我將我的數據與搜索結果或表單一起使用以更改數據......以及我相當肯定我甚至可以將它與一個連接或某個東西結合成一個查詢,但我對於sql並不是那麼好所以我不知道如何實際做到這一點..但點是,我知道我可以做什麼,我需要從這個數據庫結構..但我做得比它需要更難?做出一些明顯的noob錯誤?

+2

歡迎來到stackoverflow,非常好的問題,良好的佈局和大量的背景。 – Johan 2011-05-14 17:36:04

+2

FWIW:select * from Category_Values where generated_id in(select generate_id from Generated where original_string ='$ string') – Jeremiah 2011-05-14 17:47:59

+0

謝謝Jeremiah,會寫下來:) – slinkhi 2011-05-14 17:59:40

回答

1

我的建議:

Table: Generated 
id     unsigned int autoincrement primary key 
generated_timestamp timestamp 
last_updated  timestamp default '0000-00-00' ON UPDATE CURRENT_TIMESTAMP 
generated_method ENUM('manual','auto') 
original_string  varchar (255) 

Table: Categories 
id     unsigned int autoincrement primary key 
category_name  varchar(20) 

Table: Category_Values 
id     unsigned int autoincrement primary key 
category_id   int   
generated_id  int   
category_value  varchar (255) - value for the category 
    FOREIGN KEY `fk_cat`(category_id) REFERENCES category.id 
    FOREIGN KEY `fk_gen`(generated_id) REFERENCES generated.id 

鏈接
時間戳:http://dev.mysql.com/doc/refman/5.1/en/timestamp.html
創建表的語法:http://dev.mysql.com/doc/refman/5.1/en/create-table.html
枚舉:http://dev.mysql.com/doc/refman/5.1/en/enum.html

+0

謝謝!是的,現實中我會使列類型相似,比如ID和東西的自動增量。我並不完全確定這些東西的目的(比如foriegn的關鍵/參考資料),但我可以很容易地找到答案。 – slinkhi 2011-05-14 17:54:56

1

我覺得這個方案是完美的,你想要做什麼。類別列表現在很靈活,以便您可以添加新類別或退出舊類別(我會建議在同意刪除某個類別之前考慮長時間並努力工作 - 您是否將孤兒記錄或刪除它們等)

基本上,我說你是正確的目標。這個結構很簡單,但它對你很好。偉大的工作(以及在問題中提供恰到好處的信息)。

+0

謝謝:) ..我真的沒有影響類別名稱或將有多少。客戶基本上是在Excel中手動創建輸出文件,並聘請我來自動化該過程。所以我知道根據他們的歷史記錄,這些類別不會經常變化,但是他們有時會改變,因爲業務需求會發生變化。總的來說,它基本上只是分解原始價值和創建分類,所以基本上只是以不同的方式查看相同的數據,而(重新)分類是追溯性的,所以當它發生變化時不是很重要。 – slinkhi 2011-05-14 17:50:28