0

首先,我将 ASP.NET MVC 与使用 SQL Server 的 Entity Framework Code First 5.0 结合使用。我有一个应用程序,要求我在一周中的每一天每隔半小时保存一次状态(工作/休假)。id, day, time, status, user_id如果您对每个用户(可能是数千个用户)进行数学运算,则只有 ( ) 的 336 行。

我想知道就存储大小和应用程序的性能(在您看来)而言,这些场景中的哪一个更适合。

  1. 将这些存储为每个状态 1 行 ( id, day, time, status, user_id),因此每个用户有 336 行。
  2. 将其全部保存在数据库中的逗号分隔字段中(一个非常大的行)并使用 C# 将它们解析出来。
  3. 有没有更好的方法我没有研究或没有考虑过?

我目前倾向于选项1。

4

3 回答 3

2

这些是单独的数据片段,因此您绝对不应将它们作为逗号分隔值组合在一起。这使得搜索、报告和其他事情变得非常痛苦。

表值参数是将多行传递给 SQL Server 的最有效方式。但是,我不知道 EF 是否会将您逼入绝境——我听说您可以在 SQL Server 中执行许多 EF/CF 仍然无法执行的正常操作

它是如何工作的,你创建一个表类型(我必须在这里猜测数据类型):

CREATE TYPE dbo.StatusData AS TABLE
(
  [day] DATE,
  [time] TIME,
  [status] VARCHAR(32),
  [user_id] INT
);

这应该与您计划存储此信息的表的结构相匹配(同样,不,您不应该在同一列中存储单独的事实)。

现在您可以将其作为参数添加到您的存储过程中:

CREATE PROCEDURE dbo.SaveStatus
  @s AS dbo.StatusData READONLY
AS
BEGIN
  SET NOCOUNT ON;

  INSERT dbo.BaseTable([Day], [Time], [Status], [user_id])
    SELECT [Day], [Time], [Status], [user_id]
    FROM @s;
END
GO

现在,您可以将DataTableC# 中的一个或其他值集合传递到单个存储过程参数(使用SqlDbType.Structured)。

于 2013-01-22T02:05:10.323 回答
0

如果要将数据保存在数据库中,请将结果存储在表中。我认为您已将此描述为选项(1)。

这使您免于进行额外的处理。按照数据库标准,数据量很小。

于 2013-01-22T02:05:12.760 回答
0

我认为这取决于您需要报告的内容。就像所有当前具有特定状态的用户一样。用户在一定时期内的状态。特定用户在给定时间段内具有特定状态的时间。

状态应该是外键,日期和时间可以是从纪元开始的毫秒数,四舍五入到半小时并计算为(如果用户使用 UTC),这需要在插入之前进行更多编程,但随着数据的增长,它将有利于您的检索性能它。

将索引放在毫秒、用户 ID 和状态 ID 上。

我曾经编写将数据库内容作为 com+ 组件的类,因为如果我没记错的话,它会提高性能(池化、线程化)。

于 2013-01-22T02:23:28.153 回答