我正在为应用程序进行数据库设计,这需要大量数据的事务和分析功能。 “数据”有关于
100 x TopEntity
每个都有约(变量)
1000 x MidEntities
每个都有约(变量和随时间增加)
10 000 x BottomEntitiesTypeA 100 000 x BottomEntitiesTypeB
因此应用程序逻辑是非常分层的,(中/下)实体的查询(SELECT,INSERT等)总是知道他们的父母。
数据库的一个设计选择是
每种实体类型的表格为:
CREATE TABLE toplevel (id VARCHAR(255), field1 VARCHAR(255), ..., fieldN VARCHAR(255), PRIMARY KEY(id))
CREATE TABLE midLevel (parentId VARCHAR(255), id VARCHAR(255), field1 VARCHAR(255), ..., fieldN VARCHAR(255), PRIMARY KEY(parentId, id))
CREATE TABLE bottomLevelA (grandParentId VARCHAR(255), parentId VARCHAR(255), id VARCHAR(255), field1 VARCHAR(255), ..., fieldN VARCHAR(255), PRIMARY KEY(grandParentId, parentId, id))
CREATE TABLE bottomLevelB (grandParentId VARCHAR(255), parentId VARCHAR(255), id VARCHAR(255), field1 VARCHAR(255), ..., fieldN VARCHAR(255), PRIMARY KEY(grandParentId, parentId, id))
优点: 底层实体的简单,高效的分析查询 缺点: 冗余,底层表(特别是B类)具有2 * 100 * 1000 * 10000(0)条目来交叉引用父类,消耗1(0)GB倍大小的255长字符串。 表格的文件大小也会变大。
相反,另一种方法是根据应用程序设计数据库,动态创建表并按名称引用它们,例如
CREATE TABLE bottomLevelB+"FOR"+parentId+"AND"+grandParentId (id VARCHAR(255), field1 VARCHAR(255), ..., fieldN VARCHAR(255), PRIMARY KEY(id))
优点: 减少冗余,可以在app / views(RAM)或datawarehouse层中完成分析查询 缺点: 10万张桌子并计算
可以在数据库规范化(例如http://en.wikipedia.org/wiki/Third_normal_form)上找到背景信息,其接缝建议第二种设计。在stackoverflow上有一个类似的问题(is having millions of tables and millions of rows within them a common practice in MySQL database design?),但我找到答案:
问题:“如果数据库包含数百万个表,数据库如何执行?(同样,时间紧迫,这是否可能?)” 答案:“可能非常糟糕,特别是如果查询是由认为可以拥有数百万个表的人编写的。这告诉我这是一个不太了解数据库的人。”
不满意,因为它没有说明DB将包含很少的一致性函数,只能根据需要的分层方式查询。删除和分析查询的一致性可以使用图层在代码中处理,因为我的应用程序需要小心管理RAM。数据库只会 *提供持久性 *定期更新 *并阅读。
所以底线是我想知道第二个设计如何使用MySQL进行扩展。例如,如果表格“INSERT INTO / SELECT FROM tableName”的每个查询都是通过DB搜索线性名称来处理的,那么拥有许多表格就不会缩放。此外,任何其他提示/提示/经验表示赞赏。
答案 0 :(得分:0)
为什么使用字符串作为键?当然,您可以将它们声明为unique
,因此没有重复项。但是你的大小问题应该通过使用自动递增的整数id来修复。如果您确实需要数十亿和数十亿行,那么请使用更大的整数。
对于包含数百万个表的数据库。我不知道。我在许多类型的数据库方面拥有丰富的经验,并且从未处理过如此设计过的数据库。主要是因为它是一个非常糟糕的数据库设计的标志,有多个" parallel"表 - 即具有相同结构但名称不同的表。
这样的表是维护的噩梦。他们几乎无法重复使用查询。您必须使用某种查询生成工具来查找正在执行的操作的正确表。它们可以占用更多空间,因为有更多部分填充的表。表达外键约束是一场噩梦。还有更多的问题。
如果使用合理大小的键并不能解决您的问题,您还可以查看数据库分区,其中不同的行组分别存储。理解分区的起点是documentation。