我应该使用哪种方法来保存多行数据?

时间:2013-01-22 01:57:47

标签: sql sql-server-2008 ef-code-first entity-framework-5

首先,我使用ASP.NET MVC和Entity Framework Code First 5.0使用SQL Server。我有一个应用程序要求我保存一周中每天半小时的状态(工作/关闭)。如果你为每个用户(可能有数千个用户)做了336行的数学运算(id, day, time, status, user_id)。

我想知道哪种方案在存储大小和应用程序性能方面(在您看来)更优化。

  1. 将每个状态(id, day, time, status, user_id)存储为1行,以便为每个用户存储336行。
  2. 将它全部保存在数据库中的逗号分隔字段(一个非常大的行)中,并使用C#解析它们。
  3. 有没有更好的方式我没有考虑过或没有考虑过?
  4. 我目前倾向于选项1.

3 个答案:

答案 0 :(得分:2)

这些是单独的数据,因此您绝对不能将它们拼凑成逗号分隔值。这使搜索,报告和其他事情成为一个主要的痛苦。

Table-valued parameters是将多行传递给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

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

答案 1 :(得分:0)

如果要将数据保存在数据库中,请将结果存储在表中。我想你已经把它描述为选项(1)。

这使您无需进行其他处理。根据数据库标准,数据量很小。

答案 2 :(得分:0)

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

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

将索引放在毫秒,userid和statusid上。

我曾经把编写数据库内容的类编写为com +组件,因为如果我没记错的话会增加性能(池化,线程化)。