您肯定走在正确的轨道上。我唯一可以推荐的另一件事是研究关键价值指标,并在您的设计中使用这一原则。 KVI(或 KPI,因为它们在管理中被称为)是不同来源的值,它们被转换为可以使用通用逻辑处理的一组通用值。这将有助于评估具有不同类型里程碑的目标的进度,对于复合目标,这是至关重要的一步。我将对此进行详细说明:
目标被定义为在特定时期内达到特定里程碑或里程碑组合。里程碑是需要具有共同处理值或键值指标的值。例如,减掉 10 磅,您可以有一个键值类型为“Weight Loss”,将 1 磅转换为 1 KVI。如果您希望将里程碑相互比较,您可能希望调整权重。例如,我希望变得更健康,感觉更有活力(目标)。为了做到这一点,我必须减掉 10 磅,减少饮食中的糖分,每天至少骑行 15 英里(里程碑)。比较这些值时,1 英里不等于 1 磅。更像是30英里。从我的饮食中减少糖分并不容易,但让我们将 KVI 称为“无糖日”,并为无糖的每一天赋予相当于半磅的价值。那么 KVI 是:
1 pound = 2 KVI
1 day without sugar = 1 KVI
1 mile = 1/30 KVI
如果我每天多骑 15 英里,我可能会原谅自己一点点糖,所以这应该被纳入里程碑。换句话说,我可以达到我的自行车里程碑的 200% 和我的糖里程碑的 75%,并且仍然达到我的总体目标。但是,我不能超越这一点,仍然希望感觉健康。因此,我实现这一目标的里程碑类似于:
Lose 10 pounds: KVIType="Weight Loss", Target=20KVI, cap=100%
No sugar for period (let's say 2 weeks):KVIType="Days without sugar", target=14KVI, cap=100%
Cycle 15 miles per day: KVIType="Cycling", target=7KVI, cap=200%
学习一门新语言就是一个很好的例子。这需要学习语言的语法细微差别,有时需要学习不同的字母表、全新的词汇,然后将这些全部结合到日常使用中。所以这里有一个例子:
Learn language grammar = 100 KVI, which you can work as a percentage of a grammar course completed, for example
1000 words vocabulary = 100 KVI
Conversation = 20 KVI
在此示例中,您会将每个里程碑的上限设为 100%。您可能已经熟记语法并且掌握了 10,000 个单词,但是在您花一些时间讲该语言之前,您还没有学会它。
通过调整转换表中的权重,您可以开始以一种对您有意义的方式相互比较目标。我有能力减掉 10 磅,但没必要,所以我不会给那个标价太高。然而,我的朋友 Luka 超重 100 磅,出于健康原因不得不超重,所以他的 KVI 值会更高。您还可以扩展如何组合里程碑以提供目标的进度指示(即使用所有 KVI 的总和、任何组件里程碑的平均或最小完成百分比)。
这就是我的想法:
CREATE TABLE KVIType (
KVITypeId INT IDENTITY(1, 1) PRIMARY KEY CLUSTERED,
KVIName VARCHAR(50),
Description VARCHAR(200),
Multiplier DOUBLE PRECISION
)
CREATE TABLE Goal (
GoalId INT IDENTITY(1, 1) PRIMARY KEY CLUSTERED,
UserId INT FOREIGN KEY REFERENCES User(UserId),
GoalName VARCHAR(50),
GoalStart DATETIME,
GoalComplete DATETIME,
TargetKVI DOUBLE PRECISION,
CurrentKVI DOUBLE PRECISION
)
CREATE TABLE Milestone (
MilestoneId INT IDENTITY(1,1) PRIMARY KEY CLUSTERED,
GoalId INT FOREIGN KEY REFERENCES Goal(GoalId),
KVITypeId INT FOREIGN KEY REFERENCES KVIType(KVITypeId),
MilestoneName VARCHAR(50),
Description VARCHAR(200),
TargetKVI DOUBLE PRECISION,
CurrentKVI DOUBLE PRECISION,
TargetDate DATETIME,
CompletedDate DATETIME,
Cap INT)
CREATE TABLE Progress (
ProgressId INT IDENTITY(1, 1) PRIMARY KEY CLUSTERED,
MilestoneID INT FOREIGN KEY REFERENCES Milestone(MilestoneId),
InputValue DOUBLE PRECISIoN,
KVIValue DOUBLE PRECISION,
OccuranceDate DATETIME
)
CREATE TABLE User (
UserId INT IDENTITY(1, 1) PRIMARY KEY CLUSTERED,
UserName VARCHAR(100)
)