首先,我使用ASP.NET MVC和Entity Framework Code First 5.0使用SQL Server。我有一个应用程序要求我保存一周中每天半小时的状态(工作/关闭)。如果你为每个用户(可能有数千个用户)做了336行的数学运算(id, day, time, status, user_id
)。
我想知道哪种方案在存储大小和应用程序性能方面(在您看来)更优化。
id, day, time, status, user_id
)存储为1行,以便为每个用户存储336行。我目前倾向于选项1.
答案 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 +组件,因为如果我没记错的话会增加性能(池化,线程化)。