C# 在数据库上存储阵列的最佳方法

C# 在数据库上存储阵列的最佳方法,c#,arrays,sql-server,database,entity-framework,C#,Arrays,Sql Server,Database,Entity Framework,我有一个C#应用程序,它需要一组数组 double[10] x = {0, 1.5, ......} double[10] y = {0, 2.4, ......} no x1 x2...x10 y1 y2...y10 1 0 1.5 .... 0 2.4 .... 我需要将这些数据存储在Sql Server上,直到现在,我创建了一个表,其中包含像x1、x2、…x10和y1、y2、…y10这样的列。因此,在我的第一组中,我有一个表行 double[10] x = {0, 1

我有一个C#应用程序,它需要一组数组

double[10] x = {0, 1.5, ......}
double[10] y = {0, 2.4, ......}
no  x1 x2...x10   y1 y2...y10
1   0  1.5 ....   0  2.4 ....
我需要将这些数据存储在Sql Server上,直到现在,我创建了一个表,其中包含像x1、x2、…x10和y1、y2、…y10这样的列。因此,在我的第一组中,我有一个表行

double[10] x = {0, 1.5, ......}
double[10] y = {0, 2.4, ......}
no  x1 x2...x10   y1 y2...y10
1   0  1.5 ....   0  2.4 ....
所以当我需要数据库中的数据时,我会使用一个代码,比如(带有实体框架)

但我觉得这条路不对。有没有一种更简单的方法(比如x=data.x)。我应该改变在sql上保存数据的方式吗


感谢您的阅读和帮助。

您应该让数据以行为基础,而不是以列为基础。比如说

CREATE TABLE MyTableX
(
    GUID UNIQUEIDENTIFIER PRIMARY KEY NOT NULL,
    Value INT NOT NULL,
    SetGUID UNIQUEIDENTIFIER REFERENCES MyTableXSets(GUID)
)

CREATE TABLE MyTableXSets
(
    GUID UINQUEIDENTIFIER PRIMARY KEY NOT NULL,
    SetName VARCHAR(MAX)
)

这意味着您将在MyTableX集中有一个条目,在MyTableX中有链接行。如果您还需要知道它在哪个索引中,您也可以在MyTableX上添加一个索引INT。

您应该使数据基于行,而不是基于列。比如说

CREATE TABLE MyTableX
(
    GUID UNIQUEIDENTIFIER PRIMARY KEY NOT NULL,
    Value INT NOT NULL,
    SetGUID UNIQUEIDENTIFIER REFERENCES MyTableXSets(GUID)
)

CREATE TABLE MyTableXSets
(
    GUID UINQUEIDENTIFIER PRIMARY KEY NOT NULL,
    SetName VARCHAR(MAX)
)

这意味着您将在MyTableX集中有一个条目,在MyTableX中有链接行。如果您需要知道它在哪个索引中,您也可以在MyTableX上添加一个索引INT。

如果您描述了您试图用数据库解决的问题,您放在这个数据库中的项目通常有10个双倍,还是数字10“只是一个管理决策”,如果他们的心情不同,他们会选择9号还是11号

此外:你的10个双打真的只是10个双打,还是x[0]与x[1]有不同的含义。如果您的姓名/地址中有多个字符串,您会称它们为AddressLine1、AddressLine2、城市、邮政编码,还是称它们为AddressData[4]?想想你的双打是否有特殊意义,或者它们是否可以互换

难道几年后,当你有无数的记录时,他们突然决定要保存11双而不是10双?或者更糟:有些记录有10个值,有些记录有11个值,有些记录甚至可能有数量可变的值

如果您真的认为,数字10不仅仅是一个决定,而且是您正在解决的问题的内在因素,就像棋盘上的方块数一样稳定,那么您应该将所有10个双倍作为单独的值添加到表中,因为这对于数据库操作来说是最快的

另一方面,如果你认为将来人们可能会想要不同数量的双打,我会说选择一对多的关系

这将提高代码的可读性:“这个成绩的学生”更容易理解为“算术成绩和生物成绩的学生,以及…”的学生,即使你绝对确定你的学校只有10门课程


如果将值放在一对多关系中,则会降低某些数据库访问的速度,这将有助于提高可重用性/可维护性(将来某些项可能有11个值或零值),降低学习曲线,因为将其作为一对多实现更为常见。

如果您描述了您试图用数据库解决的问题,您将放入此数据库的项目通常有10个双倍,还是数字10“只是一个管理决策”,如果他们的心情不同,他们会选择9号还是11号

此外:你的10个双打真的只是10个双打,还是x[0]与x[1]有不同的含义。如果您的姓名/地址中有多个字符串,您会称它们为AddressLine1、AddressLine2、城市、邮政编码,还是称它们为AddressData[4]?想想你的双打是否有特殊意义,或者它们是否可以互换

难道几年后,当你有无数的记录时,他们突然决定要保存11双而不是10双?或者更糟:有些记录有10个值,有些记录有11个值,有些记录甚至可能有数量可变的值

如果您真的认为,数字10不仅仅是一个决定,而且是您正在解决的问题的内在因素,就像棋盘上的方块数一样稳定,那么您应该将所有10个双倍作为单独的值添加到表中,因为这对于数据库操作来说是最快的

另一方面,如果你认为将来人们可能会想要不同数量的双打,我会说选择一对多的关系

这将提高代码的可读性:“这个成绩的学生”更容易理解为“算术成绩和生物成绩的学生,以及…”的学生,即使你绝对确定你的学校只有10门课程


如果将值放在一对多关系中,则会降低某些数据库访问的速度,这将有助于提高可重用性/可维护性(将来某些项可能有11个值或零值),较低的学习曲线,因为一对多的实现更为常见。

在我看来,这就像是BLOB的工作?只需将整个对象以序列化形式持久化。您希望如何处理这些数据?不同的场景需要完全不同的设计。是否要按单个值查询、筛选、检索单个条目?那么它应该是一张单独的桌子。条目的数量是固定的吗?也许您可以使用稀疏列。是否只想将阵列作为一个整体加载/保存?将其转换为JSON并存储在字符串字段中。您甚至可以使用SQLServer的JSON支持解析单个值。这些值是整数吗?您可以使用带分隔符的字符串而不是JSON,这样可以节省一些字节。谢谢您的回答。我想JSON是我一直在寻找的诀窍。在我看来,这就像是BLOB的工作?只需将整个对象以序列化形式持久化。您希望如何处理这些数据?不同的场景需要完全不同的设计。是否要按单个值进行查询,fi