如何在数据库中存储带有数组的c#对象?

xxhby3vn  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(357)

我目前正在用c语言开发一个软件,希望它能将数据存储在数据库中。我的问题是,我正在寻找存储包含两个数组的对象的数据的最佳方法。数组中的对象看起来完全相同,但它们的含义不同。
作为一种信息:数据中对象的数据是有规律变化的。
例如,我得到了以下两个等级:

public class ObjectA
{
    public string Text { get; set; }
    public int Value { get; set; }
}

public class ObjectB
{
    public string Text { get; set; }
    public int Value { get; set; }
}

public class ObjectC
{
    public string Name { get; set; }
    public List<ObjectA> DetailsA { get; set; }
    public List<ObjectB> DetailsB { get; set; }
}

请注意,我目前从objectc获得了24000多个对象。这些对象的每个数组包含的对象数量可能会有很大的变化(最多200个,将来可能会更多)。如果使用其中一种解决方案,是否会导致最大行数出现问题?
关于shema数据库的外观,我有以下两个想法:
所有属性都在一个表中。
为的每个属性创建一个列 ObjectA 以及 ObjectB 这样我就可以将数组中的每个对象存储在一行中。

CREATE TABLE `data` (
  `data_id`     INT            NOT NULL,
  `name_a`      NVARCHAR(50)   NOT NULL,
  `text_a`      NVARCHAR(100)  NOT NULL,
  `name_b`      NVARCHAR(50)   NOT NULL,
  `text_b`      NVARCHAR(100)  NOT NULL,
  `value`       INT            NOT NULL,
  PRIMARY KEY (`data_id`)
)

在这种情况下,我将存储 name 多余的。
在表中为objecta创建外键
通过这样做,我可以避免存储 ObjectC 当查询数据时必须使用连接时,会产生冗余。

CREATE TABLE `data` (
  `data_id`     INT            NOT NULL    AUTO_INCREMENT,
  `name`        NVARCHAR(50)   NOT NULL,
  PRIMARY KEY (`data_id`)
)

CREATE TABLE `details_a` (
  `a_id`        INT            NOT NULL    AUTO_INCREMENT,
  `text`        NVARCHAR(100)  NOT NULL,
  `value`       INT            NOT NULL,
  `data_fk`     INT            NOT NULL,
  PRIMARY KEY (`a_id`)
)

CREATE TABLE `details_b` (
  `b_id`        INT            NOT NULL    AUTO_INCREMENT,
  `text`        NVARCHAR(100)  NOT NULL,
  `value`       INT            NOT NULL,
  `data_fk`     INT            NOT NULL,
  PRIMARY KEY (`b_id`)
)

另外,每次数组的数据发生更改时,最好在数据库中创建一个新行,还是应该更改现有数据?
编辑:添加了一些关于对象数量的信息(在c示例的正下方)。

tjjdgumg

tjjdgumg1#

用外键创建表结构可能是最好的解决方案,也是最常用的实现方法。也就是说,我知道需求会根据使用情况而变化,所以这里有一个可能的替代方案。
根据用法和大小,我发现将对象和变量作为xml序列化等价物存储在数据库中很有帮助。如果您只需要将其用于持久性存储,那么这是最简单的方法,然后您可以使用一个简单的表来保存版本控制,该表包含时间戳和xml对象。在紧要关头,您甚至可以使用sql查询xml对象来访问数据,或者在以后需要更改时迁移存储方法。我使用这种方法将具有不同数据类型的字典式数据存储在一个表中,以便快速访问环境变量。

bvjxkvbb

bvjxkvbb2#

(从评论移到回答,太长了)
方法1不适用于as或bs列表顺便说一句-你至少需要你的fks的第二个版本。
使用连接很好,数据库规范化也很好。它对数据进行分区,并允许数据库更好地优化查询。
第三种方法是使用描述符列并将a和b存储在同一dbtable中,鉴别器告诉您是a还是b。

CREATE TABLE `details_ab` (
  `a_id`        INT            NOT NULL    AUTO_INCREMENT,
  `text`        NVARCHAR(100)  NOT NULL,
  `value`       INT            NOT NULL,
  'isA'         BIT            NOT NULL,   -- True == A else B 
  `data_fk`     INT            NOT NULL,
  PRIMARY KEY (`a_id`)
)

通常的/惰性的方法是使用/配置一个ormMap器来完成这项工作,这样您就可以将数据库视为c对象,并让ormMap器处理细节(google entityframework,hibernate,code first,data first,f.e.here:msdn.microsoft.com/en-us/library/jj200620(v=vs.113).aspx)。
至于插入或更新-这取决于。如果您必须(法律上的f.e.或保险)在您的数据库中有完整的数据序列,您可以使用一个表,并且永远只插入-和顶部的视图,它显示数据项的“最新”版本。
i、 e.每一行都有一个id,您有一个“businessid”,它为您唯一地标记“一个对象”——您第一次插入它,然后您修改它:这将用一个新的db id和相同的“businessid”插入它。在表上创建一个视图,该视图只显示每个businessid的最高db id(假设为整数db id)。您的表中有整个历史记录,但应用程序“通常”只看到视图,但管理员可能会访问整个表而不是视图。。。等。

相关问题