Mysql 对数据库结构的意见和建议

Mysql 对数据库结构的意见和建议,mysql,sql,database-design,data-modeling,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 就在这一秒,我们知道了类别名称,以及要分解数据的类别数。

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

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
就在这一秒,我们知道了类别名称,以及要分解数据的类别数。但这可能会随着时间的推移而改变,例如,添加/删除的类别…更改的类别总数

好吧,我并不是真的在寻找关于如何解析行或将数据放入db或其他任何东西的帮助……我知道如何做所有这些,并且已经编写了核心脚本,以处理解析值行并将其分为不同数量的类别

我主要是在寻找关于如何构建数据库以存储这些内容的建议。所以我一直在想,这就是我想到的:

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
基本上,当我解析一行时,我将在生成的表中插入一个新条目,以及表Category_值中的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不是很在行,所以我不知道如何真正做到这一点..但重点是,我知道我可以从这个数据库结构中做我需要的事情。但是我是否让它变得比需要的更难呢?犯了一些明显的错误?

我的建议:

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
链接 时间戳: 创建表语法:
枚举:

我认为这个解决方案非常适合您想要做的事情。类别列表现在是灵活的,这样你就可以添加新的类别或删除旧的类别。我建议你在同意删除类别之前仔细考虑一下——你会孤立记录还是删除它们,等等


基本上,我是说你的目标是正确的。结构很简单,但对你来说会很好。非常好,在问题中提供了正确数量的信息。欢迎来到stackoverflow,非常好的问题,很好的布局和大量的背景。FWIW:select*from Category_value where generated_id in select generated_id from generated where original_string=“$string”谢谢Jeremiah,会写下来:谢谢:。。我对分类名称或分类数量没有影响。多年来,客户基本上一直在excel中手动创建输出文件,并聘请我来自动化该过程。因此,根据他们的历史,我知道这些类别不会经常改变,但有时确实会改变,因为业务需要改变。总的来说,它基本上只是分解原始值并创建分类,所以基本上只是以不同的方式查看相同的数据,并且重新分类具有追溯性,所以当它发生变化时,这并不是什么大问题。谢谢!是的,实际上我想让列类型相似,比如ID的自动增量之类的。我不完全确定这些东西的用途,比如国外的钥匙/参考资料,但我可以很容易地研究出来。