作为背景,我一直在研究Google BigQuery,以用作BI类型工具的后端平台。我想指出我还没有使用BigQuery,所以我的问题围绕着我在文档中看到的内容。
高级计划是 - 或许 - 将Big Query作为构建在Tableau之上的仪表板的“实时”源。
显然加载数据的最佳方法是使用使用JSON的非规范化结构(支持嵌套)
我看到我的JSON看起来像这样:
{
FirstName: 'John',
LastName: 'Doe',
Orders: {
orderNo: 12345,
orderDate: '2013-01-01'
orderlines: {
lineNo: 1,
qty: 1,
price: 12,
productId: 1234
productName: 'Learning System',
productSubsystem: 'SUB'
}
},
LeadScores: {
{
scoreName: 'Learning Tech',
scoreValue: 123,
scoreDate: '2013-01-01'
},
{
scoreName: 'ScoreB',
scoreValue: 15,
scoreDate: '2013-01-01'
}
},
Activities {
** email opens, email clicks, page view, etc. (all here) **
{
activityType: 'email',
activityAction: 'open',
activityDescription 'message-1234'
}
}
}
现在我的问题:
我可以将记录追加到“内部”集合中(比如我想每天添加更多活动)吗?还是需要成为另一个实体? (就像洞JSON是一个单一的实体)
这种结构是否有意义,或者更好地拥有“3”左右的实体(活动,订单,人口统计,分数)并使用JOIN?我读到BigQuery更喜欢不使用JOIN。
潜在的结构可能是
分数:
{
date: '2013-01-01',
scoreName: 'Score A',
scoreValue: '1234',
customerId: '123456'
}
活动:
{
date: '2013-01-01',
activityType: 'email',
activityAction: 'open',
extra: '',
customerId: '123456'
}
对于人口统计
{
customerId: '123456',
firstName: 'A',
lastName: 'B', etc..
}
哪种方法更有意义?
谢谢!
答案 0 :(得分:1)
问题a)很简单:您可以添加行和列,但不能更改现有行。将数据添加到现有行的嵌套结构中将有资格改变所述行 - 因此不可能。
问题b)是一个设计问题。你有基础知识,但不知道你的查询模式,很难优化。 BigQuery足够灵活,可以双向工作,但优化需要更多数据。
遵循的一个好的经验法则是存储很便宜:您可以保留规范化和非规范化数据 - 并根据查询进行选择。使用的最佳模式将以这种方式快速出现!