对于这种情况,最好的数据库结构是什么?

2024-01-18

我有一个保存房地产 MLS(多重列表服务)数据的数据库。目前,我有一个表包含所有列表属性(价格、地址、平方英尺等)。有几种不同的财产类型(住宅、商业、出租、收入、土地等),每种财产类型共享大部分属性,但也有一些属性是该财产类型所独有的。

我的问题是共享属性超过 250 个字段,这似乎在单个表中包含太多字段。我的想法是我可以将它们分解为 EAV(实体属性值)格式,但我读过很多关于这种格式的不好的东西,这会让运行查询变得非常痛苦,因为可以搜索 250 个字段中的任何一个。如果我要走这条路,我实际上必须从 EAV 表中提取所有数据,按列表 id 分组,在应用程序端合并它,然后针对内存中的对象集合运行查询。这似乎也不是很有效。

我正在寻找一些关于继续进行的想法或建议。也许 250+ 字段表是继续的唯一方法。

请注意,我使用的是 SQL Server 2012、.NET 4.5 w/Entity Framework 5、C#,数据通过 WCF 服务传递到 asp.net Web 应用程序。

提前致谢。


让我们考虑一下替代方案的优缺点:

所有列表+属性的一张表:

  1. 非常宽的表 - 很难查看模型和模式定义以及表数据
  2. 无需连接的一次查询即可检索列表中的所有数据
  3. 需要为每个新属性更改架构+模型。
  4. 如果您始终加载所有属性并且大多数项目都具有大多数属性的值,则效率很高。
  5. 根据属性的 LINQ 查询示例:
context.Listings.Where(l => l.PricePerMonthInUsd < 10e3 && l.SquareMeters >= 200)
    .ToList();


一张表用于所有列表,一张表用于属性类型,一张表用于(列表 ID + 属性 IDS +)值 (EAV):

  1. 列表表很窄
  2. 如果数据非常稀疏(大多数属性没有大多数项目的值),则效率很高
  3. 需要从值中获取所有数据 - 一个额外的查询(或者一个连接,但是,这会浪费带宽 - 将获取每个属性值行的基本列表数据)
  4. 不需要为新属性更改架构+模型
  5. 如果您希望通过代码对属性进行类型安全访问,则需要基于属性类型表生成自定义代码
  6. 根据属性的 LINQ 查询示例:
var listingIds = context.AttributeValues.Where(v =>
                    v.AttributeTypeId == PricePerMonthInUsdId && v < 10e3)
                .Select(v => v.ListingId)
                .Intersection(context.AttributeVales.Where(v =>
                    v.AttributeTypeId == SquareMetersId && v.Value >= 200)
                .Select(v => v.ListingId)).ToList();

或:(比较实际数据库的性能)

var listingIds = context.AttributeValues.Where(v =>
                    v.AttributeTypeId == PricePerMonthInUsdId && v < 10e3)
                .Select(v => v.ListingId).ToList();

listingIds = context.AttributeVales.Where(v =>
                listingIds.Contains(v.LisingId)
                && v.AttributeTypeId == SquareMetersId
                && v.Value >= 200)
            .Select(v => v.ListingId).ToList();

进而:

var listings = context.Listings.Where(l => listingIds.Contains(l.ListingId)).ToList();


妥协选项 - 一张表用于所有列表,每组属性(包括值)一张表(假设您可以将属性分组):

  1. 多个中等宽度的桌子
  2. 如果每组数据稀疏,则效率较高(例如,对于没有花园的列表,花园相关属性均为空,因此您无需向花园相关表中添加行)
  3. 需要一个具有多个联接的查询(联接中不会浪费带宽,因为组表与列表表的比例为 1:0..1,而不是 1:many)
  4. 需要对新属性进行模式+模型更改
  5. 使查看模式/模型更简单 - 如果您可以将属性分为 10 个组,您将拥有 25 个包含 11 列的表,而不是列表表上的另外 250 个表
  6. LINQ 查询介于上述两个示例之间。


根据您的具体统计数据(关于稀疏性)和需求/可维护性计划(例如添加/更改属性类型的频率?)考虑利弊并做出决定。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对于这种情况,最好的数据库结构是什么? 的相关文章

  • 如何跨多个表强制执行 CHECK 约束

    我有一个在 Microsoft SQL Server 2012 Express 中记录奶牛繁殖信息的数据库 显然 一头牛只有在出生后才能配种 并且在其一生中可能会配种多次 我需要在我的数据库中强制执行这些约束 我目前已经根据下图安排了一个架
  • 在 SQL Server 中,如果主键是 GUID,如何按插入顺序对表行进行排序?

    我开始在主键中使用 GUID 而不是自动增量整数 然而 在开发过程中 我习惯于查询 从 SQL Management Studio 或 Visual Studio 数据库 以查看我的应用程序刚刚插入的记录 并且我对无法按主键 desc 顺序
  • 如何修改现有表以添加时区

    我有一个包含 500 多个表的大型应用程序 我必须将应用程序转换为时区感知 当前应用程序使用new java util Date GETDATE 与服务器的时区 即没有任何时区支持 我已将这项任务分为几个步骤 以便于开发 我确定的第一个步骤
  • 优化 SQL Server 上的删除

    Deletesql server 上的有时很慢 我经常需要优化它们以减少所需的时间 我一直在谷歌上搜索一些关于如何做到这一点的提示 并且我发现了各种各样的建议 我想知道你最喜欢和最有效的驯服删除野兽的技术 以及它们如何以及为什么起作用 到目
  • 在 SQL 中将数字求小数次幂

    我试图在 MS SQL 中将一系列数字求小数 1 5 次幂 但在应用于负基数时出现 域错误 这应该不是问题 因为我要提升到奇次幂根 此外 我可以在 Excel 中进行计算 谁能评论一下 MS SQL 是否根本不支持将负幂提高到小数根 负基数
  • 如何找到多个列中的最小值

    我在我的 DB 3 col 中有一个值 我想在所有这些值中找到一个值 如下所述 表名 MyTable id col1 col2 col3 1 200 300 400 2 100 150 300 3 800 102 20 4 80 80 0
  • .NET 的 BLOB 分布式存储?

    我正在寻找一个经过相当好的测试的库 服务器来存储持久的分布式哈希表 我对使用基于 SQL 的解决方案犹豫不决 因为数据是高度面向文档的 由数百万个约 64KB 的 blob 组成 只有一个索引 由所述 BLOB 的哈希计算 并且需要能够进行
  • java ResultSet,使用MAX sql函数

    你好 这就是我想要的 我连接到数据库并检索 UniqueId 列的最大元素 并将其分配给名为 maxID 的整数变量 这是我的方法 int maxID 0 Statement s2 con createStatement s2 execut
  • 实体框架 - 相关的 ICollection 被具体化为 HashSet

    我在我的项目中使用实体框架 POCO 代理 延迟加载 今天我很惊讶地看到这个班级Transaction有其相关合集Rows物化为HashSet 代替EntityCollection 我需要EntityCollection用于跟踪集合中的更改
  • 构建视图模型的最佳方法是什么?

    我正在使用带有实体框架的 asp net mvc 并开始学习 DDD 我正在从事包含调查的项目 这是我的域模型 public class Survey public int SurveyID get set public string Na
  • 无法使用 Tedious 和 Node JS 连接到本地 SQL Server 数据库

    我正在尝试连接到本地计算机上的 SQL Server 我正在尝试使用乏味和乏味 ntlm 两者的配置如下 var tds require tedious ntlm var tds require tedious var config use
  • 有没有办法阻止 SQL Express 2008 空闲?

    我使用 SQL Express 2008 作为 Web 应用程序的后端 问题是 Web 应用程序是在工作时间使用的 因此有时在午餐或休息时间 如果 20 分钟内没有用户登录 SQL Express 将进入空闲状态模式并释放其缓存 我知道这一
  • 提供者未返回 ProviderManifest 实例

    当我想配置我的数据源 EntityDataSource 1 并将实体数据模型自动生成的连接字符串分配给它时 我收到错误 无法加载连接字符串中指定的元数据 请考虑重建 Web 项目以构建可能包含元数据的程序集 发生以下错误 提供程序未返回 P
  • 为 Zend 应用程序提供数据库处理程序的“正确”方法是什么

    假设您严格遵守某个组织的惯例Zend应用程序 http framework zend com manual en zend application html 您应该在哪里设置数据库处理程序以供应用程序开发人员访问 我知道如何设置ZendDb
  • T-SQL:用最新的非空值替换 NULL 的最佳方法?

    假设我有这张表 id value 1 5 2 4 3 1 4 NULL 5 NULL 6 14 7 NULL 8 0 9 3 10 NULL 我想编写一个查询来替换任何NULL值与表中最后一个不为空的值在那一栏里 我想要这个结果 id va
  • 数据库表设计

    我在选择数据库表的变量类型时遇到问题 有人可以给我一些关于如何选择类型的一般准则吗 以下是我的一些问题 用户 ID 应该是什么 INT 看起来很小 因为设计时应该考虑到大量用户 那么如果不是 INT 还有什么呢 大整数 VARCHAR 难道
  • 我应该用不可变或可变的数据结构来表示数据库数据吗?

    我目前正在使用 Scala 进行编程 但我想这适用于任何函数式编程语言 或者更确切地说 任何建议不变性并可以与数据库交互的编程语言 当我从数据库中获取数据时 我将其映射到模型数据结构 在函数式编程中 数据结构往往是不可变的 但是数据库中的数
  • 是什么原因导致 Linq 错误:此方法无法转换为存储表达式?

    我有一堆具有相同 select 语句的 Linq to Entity 方法 所以我想我会很聪明 并将其分离到它自己的方法中以减少冗余 但是当我尝试运行代码时 我得到了以下内容错误 该方法不能转化为 商店表达式 这是我创建的方法 public
  • 无法通过 LINQ to Entities 使用某些功能?

    我正在尝试使用 LINQ 查询在项目上实现搜索功能 由于数据有时包含带有重音符号和其他符号的字符 因此我创建了一种方法来删除这些字符以进行搜索 这是我的代码 var addresses from a in db Addresses join
  • 数据库字段中的逗号分隔值

    我有一个产品表 该表中的每一行对应一个产品 并由唯一的 ID 标识 现在 每个产品都可以有多个与该产品关联的 代码 例如 Id Code 0001 IN ON ME OH 0002 ON VI AC ZO 0003 QA PS OO ME

随机推荐

  • 如何让主线程等待所有子线程完成?

    我打算在主线程中触发 2 个线程 并且主线程应该等待所有 2 个子线程完成 这就是我的做法 void routine void arg sleep 3 int main for int i 0 i lt 2 i pthread t tid
  • v3io,文件数量限制

    您知道限制或公式吗 如何计算 v3io 中的文件数量 它可能与集群中数据节点的数量和数据服务器节点上的内存大小有关 我尝试在 v3io 中使用 50 个和 8000 万个文件 它表现良好 但了解预期限制或一般建议很重要 顺便说一句 我没有这
  • 如何使用线程模块暂停和恢复线程?

    我有一个很长的进程 我计划在一个线程中运行 因为否则它会冻结我的 wxpython 应用程序中的 UI 我在用着 threading Thread target myLongProcess start 启动线程并且它可以工作 但我不知道如何
  • common lisp - 获取文件路径

    在 Common Lisp 中 有没有办法获取编译文件的路径 类似于当前目录 该文件不在当前目录文件夹内 这应该是一条评论 但我将提供一些可能对原始发布者有所帮助的代码示例 首先 你需要更清楚自己想做什么 您想要解决的问题是什么 其次 这里
  • 对于 Web 应用程序来说,正确的 MVC 图是什么? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 哪个 MVC 图是正确的 每个都有不同的箭头 图1 图2 source stannard net au http blog stannard n
  • 为什么“map (filter fst)”的类型为“[[(Bool, a)]] -> [[(Bool, a)]]”?

    我试图理解为什么这个函数 map filter fst 有类型 Bool a gt Bool a 如果filter必须接收一个返回Bool类型的函数并且fst只返回元组的第一个元素 那么 filter fst 如何工作 filter a g
  • 将桌面拖放到浏览器 HTML5 Javascript [重复]

    这个问题在这里已经有答案了 正在寻找一些指导 仍然是一个代码学习者 并且在使用 HTML5 DnD File Api 时遇到了一些困难 玩了一些演示 尝试了解它们是如何工作的 我有一点问题 大多数似乎使用内联 css js 方法 我试图在单
  • 将 JPG 转换为 Base64 并返回 [重复]

    这个问题在这里已经有答案了 我可以使用以下 PowerShell 命令将 jpeg 转换为 base64 字符串 Convert ToBase64String Get Content Path Capture jpg Encoding By
  • 将原始查询转换为 Laravel eloquent

    如何将此原始查询转换为 Laravel 雄辩的方式 select c name as country from country c address ad city ci where ad id 1 and city id ad city i
  • 使用 Three.js 加载 .obj 时出现问题

    我正在尝试使用 Three js 加载 obj 文件 但不幸的是 它说错误 无法加载资源 服务器响应状态为 404 未找到 下面是我正在使用的示例链接 查看源代码 http mrdoob github io Three js example
  • Spring @RequestParam Map 在 POST 方法中不起作用

    我从 Spring 文档中获取了以下内容 公共 interfaceRequestParam 指示方法参数应绑定到 Web 请求参数的注释 支持 Servlet 和 Portlet 环境中的带注释的处理程序方法 如果方法参数是 Map 或 M
  • 为什么删除的内存无法重用

    我在带有 MSVC 9 0 的 Windows 7 上使用 C 并且还能够在带有 MSVC 9 0 的 Windows XP SP3 上进行测试和重现 如果我分配 1 GB 0 5 MB 大小的对象 当我删除它们时 一切正常并且行为符合预期
  • 我不“明白”程序如何自我更新。我怎样才能更新我的软件?

    假设我创建了一个 exe 文件 一切都很顺利 太棒了 它有效 假设我在软件上开发了一项新功能 并且我希望它可供已经拥有旧版本的人使用 我怎样才能使软件找到我的新版本 对其进行修补 然后继续其业务 我似乎无法思考这个问题 谢谢 EDIT 对于
  • Knex.js:创建表并插入数据

    鉴于我有一个像这样的 Knex js 脚本 exports up function knex Promise return knex schema createTable persons function table table incre
  • 如何转换spring-boot请求参数

    目前 请求方法接收编码令牌作为参数 该令牌是String但不是 JSON 或类似的东西 然后该令牌被解码为数据类 GetMapping value api xyz public ResponseEntity
  • 如何获取 YouTube 直播的实际视频 URL?

    有没有一种方法可以获取像这样的 YouTube 直播的 HLS URLhttps www youtube com embed WVZpCdHq3Qg https www youtube com embed WVZpCdHq3Qg 我尝试过典
  • NumPy 库导入错误:DLL 加载失败:找不到指定的过程

    我正在 Windows 10 上使用 Visual Studio 2017 学习 python 当我尝试将 NumPy 库导入到我的代码中时 出现此错误 我尝试过卸载并重新安装 寻找libiomp5md dll每条指令ImportError
  • Google Cloud Run 上的 numpy 和 pandas 导入速度缓慢

    我正在开发一个 API 并将其部署在 Google Cloud Run 上 有一个导入 pandas 和 numpy 的预启动 python 脚本 当我对导入进行计时时 在 Cloud Run 上 numpy 大约需要 2 秒 pandas
  • 复选框中的 ng-change 被触发多次,因为 ng-click 超过了它

    由于代码比 1000 个单词更好 我创建了一个 plunker 来展示我的问题 http bit ly 1uiR2wy http bit ly 1uiR2wy 给定特定的 DOM 元素 事情是我有一个带有 ng change 的输入复选框
  • 对于这种情况,最好的数据库结构是什么?

    我有一个保存房地产 MLS 多重列表服务 数据的数据库 目前 我有一个表包含所有列表属性 价格 地址 平方英尺等 有几种不同的财产类型 住宅 商业 出租 收入 土地等 每种财产类型共享大部分属性 但也有一些属性是该财产类型所独有的 我的问题