我将使用MySql RDBMS在服务器端开发关系数据库。
由于这个数据库将包含许多信息,并且会有许多同步查询,我想设置一个优化的结构,以避免在检索数据时进程缓慢。
我的主表名为“account”,其中包含有关姓名,姓名ecc ..的用户信息:
TABLE 'account'
ID - NAME - SURNAME - AGE
Primary key -> 'ID'
第二个表将被称为“文件”并具有一个id(外键引用account.id),一个文件名和一个名为'count'的列:
TABLE 'file'
ID - FILENAME - COUNT
Primary key -> {'ID','FILENAME'}
Foreign key -> 'ID' -> 'account.ID'
我的上一张桌子名为'visit'并具有以下结构:
TABLE 'visit'
ID - FILENAME - OPTION
Primary key -> {'ID','FILENAME'}
Foreign key -> 'ID' -> 'account.ID'
Foreign key -> 'FILENAME' -> 'file.FILENAME'
虽然第一个表不包含很多行,但第二个表可能包含数千行,第三个表包含数十万行。
也许我错了(我不是数据库系统管理和优化方面的专家:D),但是如果我在“访问”表上同时查询这么多行并与其他表连接,那么这个过程可能会变成慢。
这种结构是好还是可以改进?
最后一个问题,我可以自动更新'文件' - > 'count'列包含'visit'中包含的行数,其中'file.filename'='visit.filename'当'visit'表更新时?
或者最好每次都像'来自ecc的SELECT count(*)那样进行查询?
希望我解释自己,谢谢。
答案 0 :(得分:2)
根据您的评论,您的想法听起来不错,但一切都取决于业务,即业务逻辑 - 如果您正在考虑制作每日报告, 周,每月访问;如果企业有兴趣了解其历史 过去10年,20年或30年的访问。根据这一点,您可以不时地创建具有一段时间(可能是一年)的历史数据表。
正如您所看到的,有许多方法,您还应该考虑到业务的一部分 技术方面,如磁盘空间,备份等,保持多重要 历史数据以及持续多长时间。
修改强>:
关于你的第二个问题,是的,你可以,如果你实施了一个触发器。但是你可以查看这个不错的链接,以确保你是否做出了创建触发器的好决定。 (我不喜欢复制和粘贴,所以我更喜欢分享链接,如果我违反规则,请告诉我)
更新V.2.0:
建议:
尝试不在列名上使用受限制的名称(如count,option),我不完全是在mysql 上受限制但在SQL SERVER中是的,所以 for portability 最好不要使用这样的名字。
就像Jonathan Leffler所说,除了年龄,这不是一个好主意,你可以选择保存生日。