我正在学习mysql,正在研究数据库的工作。到目前为止一切都很好,但我有一个问题。我正在为公司组织财务报表(资产负债表,损益表,现金流量表等),大多数公司都有季度报表(未经审计)和年度报表(经过审计)。现在,对于每个语句,我都有一个列,用于标记年度或季度。
有人不可能同时在审计和未审计的声明上运行报告,所以我在想是否值得为审计创建一个表,而未经审计的表。我之所以这么认为,最终数据会变得相当大,我认为表格越小表现越快。
因此,当我设计数据库时,我应该根据内容进行设计(即将所有相同的内容分组),还是应该根据人们访问它的方式进行分组?
这引起的另一个问题是,我应该按国家对财务报表进行分组......因为我们公司在同一个国家的所有分析都是90%
答案 0 :(得分:1)
首先,我必须指出,我不是专业的数据库设计师。 但是,如果我收藏你,在这种情况下我会创建一个表,因为实体基本相同。
如果您担心mysql在大型数据集上的性能,也许最好在Postgres上开始构建您的应用程序。如果你必须运行复杂的查询,你可以使用存储的函数/过程或视图来提升mysql的性能,当然你可以使用memcache或任何nosql来让SQL休息一下。
如果您确定用户将主要搜索此类记录或该类型的记录,则可以构建三个表。一个用于所有记录,一个用于经审计和未经审计的记录。您可以使用InnoDB的触发器(ON UPDATE / DELETE / INSERT)使它们同步。他们可以像观点一样工作,但我认为(未经测试)他们会比观看更快。在这种情况下,您只需管理第一个"大"表。如果您插入审计记录,触发器将触发并将记录放入审计表中,等等......
祝福!
答案 1 :(得分:1)
如果不了解整个问题,就无法明确回答。
但是,通常您希望使用单个表来表示系统中的每个逻辑实体。从它的声音来看,季度和年度报表代表相同的逻辑实体,但不同的是单个类别列/字段。对于国家问题也是如此 - 如果唯一的区别是国家(分类),那么它们可能都应该存储在同一个表中。
如果您要按类别将数据拆分为单独的表,那么您的数据将分散在多个表中,并且很难查询。例如,如果您想要计算系统中的所有语句,则必须查询所有国家/地区表并将结果一起添加。
编辑:Joe Celko称这种反模式为“Attribute Splitting”。
答案 2 :(得分:1)
我同意Phil和Damien - 一张桌子更好。你想要的是每个类型的真实商业用途的一个表。如果你将表设计成真实的东西,甚至是抽象的或概念性的东西,那么你的数据设计更有可能经得起时间的考验。一旦您根据有关数据的实际内容勾画出一个模式,那么您可以返回并应用规范化规则来规范您的设计。
作为一项规则,设计一个您担心的性能问题是一个坏主意,但实际上并没有看到。你对大表较慢的直觉可能实际上是错误的。大多数DBMS系统都像大表一样,至少在某种程度上如此。当表很大时,查询优化器选择使用索引。当表很小时,它们通常最终会获得全表扫描,这实际上可能会降低并发访问速度。如果您的表变得如此之大以至于它们超出了DBMS的能力,那么现在是时候考虑归档您不再使用的旧数据或者购买更具可扩展性的DBMS。