Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 基于内容或视图创建表更好吗?_Mysql_Database Design - Fatal编程技术网

Mysql 基于内容或视图创建表更好吗?

Mysql 基于内容或视图创建表更好吗?,mysql,database-design,Mysql,Database Design,我正在学习mysql,并且正在为工作而开发数据库。到目前为止一切都很好,但我有个问题。我为公司编制财务报表(资产负债表、损益表、现金流量表等),大多数公司都有季度报表(未经审计)和年度报表(经审计)。现在,对于每一份声明,我都有一个专栏,每年或每季度对其进行标记 不太可能有人同时对已审计和未审计的报表运行报告,所以我在想是否值得为已审计和未审计报表创建一个表。我认为这是因为数据最终会变得相当大,我认为表越小,性能越快 因此,当我设计一个数据库时,我应该根据内容进行设计(即对所有相同的内容进行分组

我正在学习mysql,并且正在为工作而开发数据库。到目前为止一切都很好,但我有个问题。我为公司编制财务报表(资产负债表、损益表、现金流量表等),大多数公司都有季度报表(未经审计)和年度报表(经审计)。现在,对于每一份声明,我都有一个专栏,每年或每季度对其进行标记

不太可能有人同时对已审计和未审计的报表运行报告,所以我在想是否值得为已审计和未审计报表创建一个表。我认为这是因为数据最终会变得相当大,我认为表越小,性能越快

因此,当我设计一个数据库时,我应该根据内容进行设计(即对所有相同的内容进行分组),还是根据人们访问它的方式进行分组


这引发的另一个问题是,我是否应该按国家对财务报表进行分组……因为我们公司的所有分析都在同一个国家中下降了90%

首先,我必须指出,我不是一个专业的数据库设计师。 但是如果我提醒你,在这种情况下,我会创建一个表,因为实体基本上是相同的

如果你担心mysql在更大数据集上的表现,那么最好开始在Postgres上构建你的应用程序。如果必须运行复杂的查询,可以使用存储函数/过程或视图来提高mysql的性能,当然也可以使用memcache或任何nosql工具让SQL稍微休息一下

如果您确信用户将主要搜索这种或那种类型的记录,那么您可以构建三个表。一个用于所有记录,一个用于已审计和未审计记录。您可以使它们与InnoDB的触发器保持同步(在更新/删除/插入时)。它们可以像视图一样工作,但我认为(未经测试)它们会比视图更快。在这种情况下,您只需要管理第一个“大”表。如果插入审核记录,触发器将触发并将记录放入审核表中,依此类推


致以最良好的祝愿

首先我必须指出,我不是一个专业的数据库设计师。 但是如果我提醒你,在这种情况下,我会创建一个表,因为实体基本上是相同的

如果你担心mysql在更大数据集上的表现,那么最好开始在Postgres上构建你的应用程序。如果必须运行复杂的查询,可以使用存储函数/过程或视图来提高mysql的性能,当然也可以使用memcache或任何nosql工具让SQL稍微休息一下

如果您确信用户将主要搜索这种或那种类型的记录,那么您可以构建三个表。一个用于所有记录,一个用于已审计和未审计记录。您可以使它们与InnoDB的触发器保持同步(在更新/删除/插入时)。它们可以像视图一样工作,但我认为(未经测试)它们会比视图更快。在这种情况下,您只需要管理第一个“大”表。如果插入审核记录,触发器将触发并将记录放入审核表中,依此类推


致以最良好的祝愿

在不了解整个问题的情况下,这是不可能确定地回答的

但是,通常需要一个表来表示系统中的每个逻辑实体。从字面上看,季度和年度报表代表相同的逻辑实体,但在单个类别列/字段上有所不同。国家问题也是如此——如果唯一的区别是国家(分类),那么它们很可能都应该存储在同一个表中

如果按类别将数据拆分为单独的表,则数据将分散在多个表中,并且很难查询。例如,如果您想要对系统中的所有语句进行计数,则必须查询所有国家/地区表并将结果相加


Edit:Joe Celko称这种反模式为“”

在不了解整个问题的情况下,这是不可能确定地回答的

但是,通常需要一个表来表示系统中的每个逻辑实体。从字面上看,季度和年度报表代表相同的逻辑实体,但在单个类别列/字段上有所不同。国家问题也是如此——如果唯一的区别是国家(分类),那么它们很可能都应该存储在同一个表中

如果按类别将数据拆分为单独的表,则数据将分散在多个表中,并且很难查询。例如,如果您想要对系统中的所有语句进行计数,则必须查询所有国家/地区表并将结果相加


Edit:Joe Celko称这种反模式为“”

我同意菲尔和达米恩的观点——一张桌子更好。你想要的是每种类型的真正的商务物品都有一张桌子。如果您将表设计为类似于真实事物,甚至是抽象或概念性的事物,那么您的数据设计更有可能经受住时间的考验。一旦你根据你拥有的数据勾勒出了一个基于真实事物的模式,那么你就可以回去应用规范化规则来规范化你的设计

通常,为一个您担心但实际上还没有看到的性能问题进行设计是一个坏主意。你关于大桌子慢的直觉可能是错误的。大多数DBMS系统喜欢较大的表,至少在某种程度上是这样。当表很大时,查询优化器选择使用索引。当表很小时,它们通常会得到完整的表扫描,这实际上会降低并发访问的速度。如果你的表变得如此之大以至于超出了DBMS的能力,那么是时候考虑存档你不再使用的旧数据了。