答案 0 :(得分:1)
确定。这是我的残酷。我不明白这个模型。 因此,不要试图对此进行如此评论,而是在我看到它时,我想到了一些想法。
我认为你应该看看你的1:1关系(所有这些)。为什么DayLog和StrategyDailyLog在两个表中分开?可能是因为您将始终拥有至少一个DayLog项目,但并非所有DayLog项目都具有StrategyDailyLog项目。如果是这种情况,您可以在DayLog表中使用allow nulls选项获得StrategyID FK。
如果您可以显示哪些字段是必需的以及哪些字段接受null作为值,那将有助于理解模型。
您的所有表都有自己的id列。在进行1:1关系和m:m关系时,这可能会令人困惑。对于1:1关系,通常两个表之间的关系是在两个表中的主键上进行的。如果不这样做,则必须在外键列上创建候选键。在您的情况下,这意味着StrategyDailyLog应该在DayLogID上有候选键。
两个表之间的m:m关系通常通过在两个表之间添加一个新表来解决。这些字段在一起是中间表的主键。 让我们举例说,你应该在Category和Strategy之间建立m:m的关系。然后,您应该创建一个名为CategoryStrategy的表,其中包含两个字段CategoryID和StrategyID,它们是表CategoryStrategy的主键。
我希望我的评论有意义,并且对你有用。
编辑2011-01-17
我认为您不应该将IDENTITY列用作所有表中的主键。 m:m关系不需要它,所以你不应该这样做。我也认为你误解了我对候选键的意思。候选键是可以用作主键的键。在MS SQL Server中,为候选键定义UNIQUE CONSTRAINT。 例如:表StrategyItem的id为PK,但StrategyID和DailyItemID的组合是候选键。更好的方法是删除id并使用StrategyID + DailyItemID作为PK。
下面是我根据您的描述构建的架构。我可能错过了一些重要的东西,因为我不知道你想做什么。 在设计模式时,您不应该过多考虑查询性能和构建聚合。这可以通过在列上创建索引并在查询中使用sum,count和group by来处理。对于日期或日期间隔的查询,在下面的模型中创建的列的索引是必需的。在MS SQL Server中,有一种称为聚簇索引的东西。默认表的PK是聚簇索引,但在这种情况下,我会将Created列上的索引作为聚簇索引。
一个类别有0,1或更多策略。 LogItem具有类别和可选的一个策略 LogItem.Created保存日期和时间。