gpt4 book ai didi

c# - 实体数据未知时的数据库设计?

转载 作者:太空狗 更新时间:2023-10-30 00:21:28 25 4
gpt4 key购买 nike

我想知道以下数据库模式是否会在以后产生影响。假设我正在编写一个地点实体。我不确定 place 的哪些属性将存储在数据库中。我正在考虑制作两张表:一张用于保存所需(或常见)信息,一张用于保存其他信息。

表 1 - 地点

  • PK PlaceId
  • 姓名
  • 纬度
  • 等... (所有常用字段)

表 2 - 地点数据

  • PK DataId
  • PK 字段名
  • PK FK PlaceId
  • 现场数据

使用场景

我希望某些访问者能够输入关于某个地方的自定义字段。例如,餐厅是一个地方,可能有以下字段:HasParking、HasDriveThru、RequiresReservation 等...但汽车经销商也是一个地方,这些字段对于汽车经销商。

我想支持任何类型的地方,来自单个表(好吧,第二个表有自定义字段),因为我不知道最终将添加的地方的类型数量到我的网站。

总体目标

在我的 asp.net MVC (C#/Razor) 网站上,我显示了一个 place,它将显示属性,作为填充的无序列表:SELECT * FROM PlaceData WHERE PlaceId = @0.

这样,我就不需要在 View 上显示空的字段名称(或者对每个字段执行 string.IsNullOrWhitespace() 检查。如果每个属性都是表中的一列。

我假设这种情况很常见,但是有更好的方法吗?特别是从性能的角度来看?这种模式的主要缺点是什么?

最佳答案

您的想法被称为实体-属性-值表,在 RDBMS 中通常是坏消息。 RDBMS 面向高度结构化的数据。

总体选项是:

  1. 在 RDBMS 中对数据库进行进一步建模,如果有人向您隐瞒规范,这很可能会发生。

  2. 坚持使用 RDBMS,为结构可变的数据使用 XML 列。如果您的数据存储模式的一小部分是半结构化或非结构化的,那么这最有意义。从 MS SQL Server 的角度来看,可以为这些数据编制索引,并且您可以检查您的数据是否符合 XML 架构定义。

  3. 转移到非关系数据库,例如 MongoDB、Cassandra、CouchDB 等。这是许多社交网站和我怀疑博客网站运行的方式。此外,如果需要的话,结合使用 RDBMS 和非关系存储也是合理的。

EAV 变得一团糟,因为您在数据库中创建数据库并失去了 RDBMS 可以提供的所有好处(外键、数据类型实现等),并且重建对象所需的 SQL 代码也消失了从千层面到意大利宽面条再到意大利面,一眨眼就过去了。

鉴于已添加到问题中的信息,在 Place 表中创建 XML 类型的 PlaceDetails 列似乎很合适。如果性能要求要求,您还可以将该列拆分到另一个具有 1:1 关系的表中。

这样做的好处是您可以使用非常简单的 SQL 代码检索数据,甚至可以使用 xml 数据类型的方法来搜索数据。但这种方法还允许您在 C# 中执行更复杂的面向表示的数据解析,这比 T-SQL 更适合该目的。

关于c# - 实体数据未知时的数据库设计?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5164622/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com