【问题标题】:Database field with multiple allowed value types具有多种允许值类型的数据库字段
【发布时间】:2015-03-08 22:05:17
【问题描述】:

我在我的 ASP.NET MVC 应用程序中使用 Fluent NHibernate 来检索数据并将其保存到 Postgresql 数据库。

假设你有一张桌子,里面有

Fields {Name, DataType, Value}

//Model
public class Table {

    public virtual string Name { get; set;}

    public virtual string DataType { get; set;}

    public virtual string Value { get; set;}
}

所以一个典型的记录可能是:

Record { "Firstname", "Varchar", "Bob" }
Record { "DateOfBirth", "Timestamp", "2003-04-12 04:05:06" } 

因此,为了让这一切正常工作,值必须是 Varchar 类型。

有没有更好的方法来做到这一点?我不喜欢 Value 是类型 string / Varchar 的想法。

我希望值类型为object 或其他类型。我已经尝试过了,但从Fluent NHibernate 得到了一个Exception

您将如何从 DDD 的角度解决这个问题?

【问题讨论】:

  • 我不了解 postgresql,但我过去曾在生产环境中的 MSSQL 表中使用过这种确切的策略,并取得了成功。 SQL 没有给你一个“对象”数据类型来使用,所以我发现的下一个最好的事情是 varchar 列中的序列化对象,第二列存储数据类型。也许其他人会有更好的解决方案。

标签: c# postgresql nhibernate fluent-nhibernate domain-driven-design


【解决方案1】:

您可以使用 json(如果您的 postgres 版本支持,也可以使用 jsonb)。

在这种情况下我不会这样做。为了充分利用索引和数据搜索,最好想出一种结构,将不同的数据类型保存在不同的字段中,以便对它们进行高效的排序和搜索。

一个例子:

create table obj as (obj_id serial,
                     name varchar,
                     vc_data varchar,
                     ts_data timestamp,
                     intdata integer
                     datatype varchar);

如有必要,您可以在所有字段上创建索引,甚至可以创建视图 您的一些代码更简单(不按数据类型搜索或排序时)

create view obj_view as
  (select obj_id,
   name,
   coalesce(vc_data, ts_data, int_data) data
   from obj)

【讨论】:

  • json支持PostgreSQL 9.2及以上,jsonb支持PostgreSQL 9.4及以上
  • 视图可以很好地用于查询,但您必须更改插入/更新/删除的应用程序逻辑
猜你喜欢
  • 2014-10-26
  • 2020-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-27
相关资源
最近更新 更多