根据Entity Framework和PostgreSQL数据库,我们试图模拟一部分数据,这些数据基本上由一个名为OtherObject
的对象的引用列表组成,该对象具有一个ID。我们尝试存储的数据是MyObject
,由Id
和两个列表(最大长度为12)的一个或多个OtherObject
引用和数量组成OtherObject
秒。因此,我们希望存储与此相关的数据(例如,单独的表和列):
FirstPattern:
OtherObject with ID 1, 10 times
OtherObject with ID 4, 12 times
SecondPattern:
OtherObject with ID 2, 2 times
OtherObject with ID 3, 4 times
OtherObject with ID 4, 11 times
为此,我们认为ICollection
KeyValuePair
是合适的。这样我们就有一个列表,其中包含每个键的值(一个数量)(OtherObject
)。
模型基本如下:
public class MyObject
{
public int Id { get; set; }
public IDictionary<OtherObject, int> FirstPattern { get; set; }
public IDictionary<OtherObject, int> SecondPattern { get; set; }
}
问题是,我们怎样才能将ICollection
KeyValuePair
个{{1}}存储在数据库中?我们也想知道这是否是最好的方法。
如果您有(更好的)方法将这些数据存储在数据库中,我们希望听到它!谢谢你的关注。
答案 0 :(得分:2)
有两种类型特别适合存储整个词典:hstore
和json
- 或者Postgres 9.4 +中最优越的jsonb
。< / p>
Postgres还有一个专用的xml
数据类型(mentioned in the comments by DJ KRAZE),但我宁愿选择前三个选项中的一个。 XML相对冗长,更复杂(更不用说复杂),并且可能因你的目的而过度。
如果你想从数据库中得到的只是存储和检索整个字典,这些都是不错的选择 有关dba.SE的相关答案中的详细信息和链接:
您还会在关系数据库中找到关于 eav (entity-attribute-value)存储的优缺点的广泛讨论。
如果您需要来自数据库的其他内容,例如关系完整性,外键或各种其他约束,轻松访问单个值,最小存储大小,简单索引等。我建议使用一个或多个专用表({ {3}})列。
从我收集的内容,&#34; MyObject&#34; (m
)包含对&#34; OtherObject&#34;的引用的集合。 (o
)。每个m
与(24)o
相关,每个o
与0-n m
相关 - 这可以用经典的n:m关系实现。以下是详细说明: