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

sli*_*khi 6 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
Run Code Online (Sandbox Code Playgroud)

我有一个类别列表来打破这些行,例如:

Original   Cat1  Cat2  Cat3  Cat4  Cat5
---------------------------------------
a:b:c:d:e  a     b     c     d     e
Run Code Online (Sandbox Code Playgroud)

从右边开始,已知类别名称,以及打破数据的类别数量.但这可能会随着时间而改变(例如,添加/删除的类别......类别的总数已更改).

好的,所以我并不是真的在寻找有关如何解析行或将数据导入数据库或其他内容的帮助......我知道如何做到这一切,并且已经完成了核心脚本,以处理解析值行并分成不同数量的类别.

大多数情况下,我正在寻找有关如何构建数据库来存储这些东西的建议.所以我一直在考虑它,这就是我提出的:

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
Run Code Online (Sandbox Code Playgroud)

基本上我的想法是,当我解析一行时,我将在表中插入一个新条目Generated,以及表中的X条目Category_Values,其中X当前有很多类别.类别名称存储在另一个表中Categories.

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

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

select * from Generated where original_string = '$string'
// id is put into $id
Run Code Online (Sandbox Code Playgroud)

然后

select * from Category_Values where generated_id = '$id'
Run Code Online (Sandbox Code Playgroud)

...然后我会让我的数据用于搜索结果或表单来改变数据......我很确定我甚至可以将它组合成一个带有连接或其他东西的查询但我不是那样的伟大的sql所以我不知道如何真正做到这一点..但重点是,我知道我可以做我需要从这个数据库结构..但我是否使它比它需要更难?制造一些明显的菜鸟错误?

Joh*_*ica 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
Run Code Online (Sandbox Code Playgroud)

链接
时间戳: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