您提出的星型模式设计有两个可能的问题。
问题 1:灵活性
通过将价格确定标准设置为查找表的一组固定外键,您创建了一种情况,即您要跟踪价格的每门课程都必须以某种方式适应该方案。一旦您与创意营销经理一起参加课程,您就会发现自己不得不修改您的架构以适应该课程。
问题 2:数据输入工作
正如您已经注意到的那样,拥有一组固定价格决定因素意味着所有这些决定因素的交叉产品是需要维护的大量数据。令人沮丧的是,对于许多课程来说,一些决定因素并不重要。
另一个可能令人沮丧的事情可能是每门课程对每个决定因素都有自己的解释。例如,旺季对每门课程意味着什么?如果你不关心这些细节,那么你就可以了,但如果你真的必须用具体的术语来解释自己(即我们所说的课程X的“高峰”是什么日期?),那么你也会有很多价格维度表中的数据。
解决问题:
如果您愿意使用更复杂的数据模型,则可以显着减少数据管理量。您可以表驱动决定因素,而不是具有一组固定价格点决定因素的星型模式。架构将是这样的:
COURSE -- The list of courses you are tracking
courseid (PK)
, name
COURSE_PRICE_POINT -- An individual price point for a course
cppid (PK)
, courseid -- FK to COURSE
, price -- The amount, if your system is multi-currency, include a code
-- for the currency, e.g. GBP, EUR, USD, etc.
COURSE_PRICE_FACTOR -- The list of factors that make a specific price point applicable
cppid (PK) -- PK, also FK to COURSE_PRICE_POINT
, pfid (PK) -- PK, also part of FK to FACTOR_VALUE
, fvid -- the other part of the FK to FACTOR_VALUE
FACTOR_VALUE -- A lookup table of price factors, e.g. "Peak Season", "18 Holes"
pfid (PK) -- PK, also FK to PRICE_FACTOR
, fvid (PK)
, value -- Description of the price factor value
PRICE_FACTOR -- A list of the dimensions that impact price,
-- e.g. Season, Holes, Person, Time
pfid (PK)
, description -- A caption/name for the price factor.
该模型的工作方式是,对于课程可能收取的每个特定价格,您在COURSE_PRICE_POINT
. 如果您的星型模式表可能具有尽可能少的行数,则此表中将有一条记录,即您在星型模式定价表中可能拥有的每条记录。
星型模式定价表中的价格决定因素列变为PRICE_FACTOR
. 可能出现在行列式查找表中的值成为FACTOR_VALUE
. 这部分的工作量是相同的,除了如果您发现需要添加新的价格因素,您需要做的就是输入一些新数据而不是更改您的表定义,这是您将面临的问题星型模式方法。
要将价格点实际固定到其决定因素,您需要填充COURSE_PRICE_FACTOR
以将价格点连接到定义价格点所需的最小因素值集。请注意,FACTOR_VALUE
由其 FK 标识为PRICE_FACTOR
。这意味着 的 PK作为 FK 的一部分存在PRICE_FACTOR
于. 这很重要,因为它允许您在价格点 ID 和价格因素 ID 的组合上定义唯一索引(我已将该组合作为表的 PK)。这意味着模式将施加限制,即您不能对相同的价格因素有矛盾的值,这是一个很好的小数据一致性约束。COURSE_PRICE_FACTOR
FACTOR_VALUE
所有这些似乎都需要做很多工作,那么为什么它比星型模式更好呢?看一个例子,假设您的星型模式中有季节、洞、时间和人物的四个变体。这可能是一个低估,但让我们继续吧。这意味着您需要每门课程 4 x 4 x 4 x 4 = 256 条记录来跟踪所有定价变化。如果一门课程有一个非常简单的价格卡,比如:“淡季是你每天 100 美元可以玩的全部”。这将是我建议的模型中的一个价格点,但星型模式仍需要 1 x 4 x 4 x 4 = 64 条记录。
更糟糕的是:对于星型模式,根据您打算如何使用它,您可能有一条规则,即每个查找表值需要在每门课程的定价表中表示。这意味着添加一个新记录,比如赛季将需要在每门课程中创建一堆新记录,即使其他课程不识别您的新维度值。
我建议的模型的主要优点是(i)您可以在特定条件下对特定课程的定价非常具体和准确,以及(ii)您的数据维护最小化。
这个模型的缺点是什么?此模型对于为一门课程与另一门课程设置价格比较图表不会很有帮助。如果您要比较的两个课程的定价结构非常不同,那么很难找到一种方法在并排的价格比较表中显示价格表。