关于数据库结构的意见和建议

时间:2011-05-14 17:31:45

标签: mysql sql database-design data-modeling

我正在构建此工具来分类数据。基本上我会定期接收平面文件中的数据行,如下所示:

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中插入一个新条目,以及在表Category_Values中插入X条目,其中X当前有很多类别。类别名称存储在另一个表Categories中。

我的脚本将立即执行的是处理原始值行并将生成的类别值输出到要在某处发送的新文件。但后来我有这个数据库,我正在制作生成的数据,以便我可以创建另一个脚本,我可以搜索并列出以前生成的值,或使用新值或其他任何内容更新以前生成的条目。

这看起来像一个好的数据库结构吗?我有什么明显的遗漏或者可能会让自己陷入困境?例如,有了这个结构......好吧......我不是一个SQL专家,但我想我应该能够做到这一点

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

然后

select * from Category_Values where generated_id = '$id'

...然后我会将我的数据用于搜索结果或表单来改变数据......我相当确定我甚至可以将它组合成一个带有连接或其他东西的查询但是我我对sql不是那么好,所以我不知道如何实际做到这一点..但是,我知道我可以从这个数据库结构中做我需要的东西。但我是否正在努力比它需要的?制造一些明显的菜鸟错误?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

我认为这个解决方案非常适合您想要做的事情。 “类别”列表现在具有灵活性,因此您可以添加新类别或退出旧类别(我建议在同意删除类别之前对其进行长期和艰苦的思考 - 您是否可以孤立记录或删除它们等等。)

基本上,我说你的目标正确。结构很简单,但它适合你。干得好(并且在问题中提供了正确数量的信息,并且做得很好)。