或者List<KeyValuePair<int,Object>>
,或字典。
根据 Entity Framework 和 PostgreSQL 数据库,我们正在尝试对一部分数据进行建模,该数据基本上由对名为 OtherObject
的对象的引用列表组成。它有一个ID。我们尝试存储的数据是 MyObject
并由 Id
组成,以及对 OtherObject
的一个或多个引用的两个列表(最大长度为 12)和金额OtherObject
s。因此,我们想要存储与此相关的数据(例如在单独的表和列中):
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
s 是合适的。这样我们就有了一个列表,其中每个键都有一个值(金额)( 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
数据库中有吗?
有(更好)的方法吗?
最佳答案
有两种类型特别适合存储整个字典:hstore
和 json
- 或者 Postgres 9.4 或更高版本中最优秀的 jsonb
。
Postgres 还有一个专用的 xml
数据类型,但我宁愿选择前三个选项之一。 XML 相对冗长且更复杂(不是说令人费解),对于您的目的来说可能有点过分了。
如果您想要从数据库中获得的只是存储和检索整个字典,那么这些都是不错的选择。请参阅:
您还会发现有关关系数据库中 eav (实体-属性-值)存储的优缺点的广泛讨论。
如果您想从数据库中获得其他东西,例如参照完整性、外键或各种其他约束、轻松访问单个值、最小存储大小、简单索引等。我建议使用一个或多个专用表(normalized )列。
标准化表格布局
据我所知,“MyObject”(m
) 包含对“OtherObject”(o
) 的引用集合。每个 m
与 (24) o
相关,每个 o
与 0-n m
相关 - 可以以经典的 n:m 关系来实现。以下是详细说明:
关于c# - 如何在数据库中存储数据表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27065244/