2011-05-14 62 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