如何设计一个数据库来存储属性,通过同义词选择属性

2023-12-28

我正在为房地产应用程序设计一个数据库。事实证明,它比我预期的更复杂(也许我把事情复杂化了)。

这些问题本质上是由于以下因素的存在造成的:

  • 同义词 例如,术语:公寓、公寓和顶层公寓本质上都指的是同一类型的房产
  • 属性(不同的属性类型有不同的属性) 例如,公寓可以是底层或顶层等

我最终得到了针对不同属性类型的相当(无意中)复杂的分类树。树节点是属性类型的实际实例。

我想创建一个数据库,以便我不仅可以使用任何同义词进行查询,还可以使用属性进行查询。

例如,查询(伪 SQL):

从属性中选择 *,其中 synonym="flat" 和属性 IN ('底层', '花园');

应该返回公寓|公寓列表,这些公寓要么位于底层,要么带有花园。

有人可以帮助我如何设计数据库模式以允许上述类型的查询吗?

最后但并非最不重要的一点是,我将使用 MySQl 或 PostgreSQL 作为后端数据库,但希望该方法与数据库无关 - 如果可能的话。


我会对你的归因方案采取不同的方法。我不会将不同的属性视为同义词,而是将它们视为重叠,或者更具体地说,nested属性的描述。这将处理您的业务案例,同时承认迈克·谢里尔(Mike Sherrill)的敏锐观察。

这是一个快速的 ERD 草图:

通过非常快的数据字典:

PROPERTY是一块房地产。

CATEGORY是描述性属性的集合。该表的意义更多的是作为属性的组织者而不是其他任何东西。它可以包括“财产类型”、“所有权结构”、“浴室数量”以及其他任何可能感兴趣的内容。

ATTRIBUTE是一种特定的兴趣品质。请注意此实体类型上的内卷关系。稍后我会详细讨论这个问题。要点是属性可以更一般或更具体,并且某些属性可以被视为其他属性的细化。

DESCRIPTOR是财产和与该特定房地产相关的属性的交集。

那么这应该有什么帮助呢?

关键是属性如何发挥作用。如果您使用嵌套集合模型,那么您可以或多或少地解决具体的归因和搜索条件。考虑以下一个潜在类别及其相关属性的图表:

在此示例中,CATEGORY 是“财产类型”。从图中可以看出,该类别中的属性按层次结构细分。图中的每个方框都是ATTRIBUTE中的一条记录。包含其他框的框具有子属性。位于另一个盒子内的盒子与其包含的盒子有一个 FK,依此类推。

这样,您可以说“我想找到一套顶层公寓”。然后,您可以找到具有指向“阁楼”属性的相关描述符的 PROPERTY 记录。这很容易。但如果您的搜索结果为空怎么办?

这种方法的优点是,您可以通过说“让我们将归因层次上升到下一个比顶层公寓不太具体的事物”来放宽您的标准。在我的示例中,这将是“高层建筑”。现在您再次尝试搜索,您可能会有更好的运气。

这样的系统使您能够在每个归因类别中尽可能具体,同时充分放松其他类别以开始获得搜索命中。这确实是房地产经纪人的工作,不是吗?帮助客户做出必要的妥协,找到最适合他们最重要标准的方案?

处理嵌套集

这种方法唯一棘手的部分是如何处理嵌套集。有很多方法可以做到这一点,其中许多方法已在其他地方详细记录。我自己就喜欢访问次数 http://www.sitepoint.com/hierarchical-data-database-2/技术,特别是对于相对静态的数据集。这使得很容易找到某些给定 ATTRIBUTE 或其任何子属性的匹配项,而无需在 SQL 中执行任何特殊操作。

编辑:那么这是如何工作的?

OP 问你如何处理卧室数量等问题以及查询是什么样的?我们再举一个例子来说明:

上面显示了“卧室数量”类别的嵌套集。我还将访问次数添加到图表中。请注意访问编号的工作方式,特别注意任何给定属性值的左(绿色)和右(红色)数字包含任何从属属性的左和右访问编号。例如,“2+ Bedrooms”的左右数字分别为 6 和 15。属于“2+ 卧室”的每个属性都有属于此范围的左侧和右侧数字。

那么如何查询具有给定描述符的属性呢?假设我们想要查找具有两间或更多卧室的所有房产。此类查询的 SQL 可能如下所示:

select P.* 
from PROPERTY P
  inner join DESCRIPTOR D
    on P.id = D.property_id
  inner join ATTRIBUTE A
    on D.attribute_id = A.id
where A.left >= (select X.left from ATTRIBUTE X
                 where X.name = '2+ Bedrooms')
  and A.right <= (select Y.right from ATTRIBUTE Y
                  where Y.name = '2+ Bedrooms')

请注意,上面的查询与您实际使用的查询略有不同。例如,您可能会使用其 int 标识键而不是字符串名称来查找过滤属性。但是,我想我应该将其保留为如图所示,以便清楚地了解要点,即您可以通过查看进行过滤not对于特定的相关属性,但对于属于您的过滤器的任何相关属性range.

如果您想过滤多个属性,只需向 where 子句添加更多子子句即可。

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

如何设计一个数据库来存储属性,通过同义词选择属性 的相关文章

  • 使用 CouchDB 视图替换 SQL 中的多个联接

    我正在为我的应用程序实现过滤功能 但在 CouchDB 上编写视图时遇到问题 在 SQL 中 这将是一个具有多个连接的语句 如何替换 CouchDB 中的多重连接 本文涵盖单连接 http www cmlenz net archives 2
  • 在数据库中存储有序列表的最佳方法?

    在数据库中存储 有序列表 以便轻松更新它们 添加 删除和更改条目顺序 的最佳方法是什么 考虑一个数据库 其中有一个用户和电影表 每个用户都有一个最喜欢的电影列表 由于许多用户可能喜欢同一部电影 因此我将用户和电影分开表 并使用第三个表 us
  • SQLAlchemy 中的复杂外键约束

    我有两张桌子 SystemVariables and VariableOptions SystemVariables应该是不言自明的 并且VariableOptions包含所有变量的所有可能选择 VariableOptions有一个外键 v
  • 在理解聚集索引时我错过了什么?

    如果没有任何索引 则通过 IAM 索引分配映射 访问表行 我可以使用 IAM 以编程方式直接访问行吗 缺少索引是否意味着读取特定行的唯一方法是全表扫描读取所有表 为什么 IAM 不能参与更具体的直接访问 如果表是堆 换句话说 它没有聚集索引
  • 设计用于库存控制的“EAV”或“类/具体表继承”数据库

    我正在为一个建设项目开发库存控制系统 店员负责添加新库存并将其分发给员工 从员工处返还 这些物品 以及它们的属性 将会非常多样化 例如钢制品 服装 设备 机械 工具等 我的问题是是否要去类 具体表继承 https stackoverflow
  • 预订表中仅允许工作时间

    PostgreSql 9 2 保留表定义为 CREATE EXTENSION btree gist CREATE TABLE schedule id serial primary key during tsrange not null EX
  • 对于依赖于时间的大型数据集,命名表 september_2010 是否可接受且有效?

    我每天需要存储大约 73 200 条记录 由 3 个数据点组成 id 日期和整数 我团队的一些成员建议使用月份作为表名称 september 2010 创建表 而其他人则建议使用一个包含大量数据的表 关于如何处理如此大量的数据有什么建议吗
  • 管理数据库更改的最佳方法[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 管理数据库更改的最佳方法是什么 无论数据库客户端的语言如何 我都需要有一个解决方案 另外 我希望能够在这些更改中使用特定的数据库功能
  • ERM:三元关系中的基数

    如何读取和 或指定实体关系模型 陈表示法 三元关系中的基数 最小 最大 例如 一位领导与他的相关员工一起考察了多项资格认证 现在 我想知道如何在最小 最大 表示法中指定基数 这是给定基数的另一个示例 我想知道如何阅读它 三元关系可以解读为
  • 一个表列可用于多个 fk 表?

    对于这种情况 最好的解决方案 做法是什么 我有一个表 可以引用多个表 对象 以下是 UserCalendar 表的示例 这是一个用户保存事件的表 但系统也从后面插入到该表中 用户执行一些有截止日期的服务 这些服务也被插入到该表中 问题是没有
  • 数据库优化命令

    在用户可以下订单的数据库中 最好有一个包含地址的新表 还是每个订单的标题中都有地址数据 这不仅涉及用户 及其地址 还涉及您所销售产品的价格和其他信息 这些信息可能会发生变化after订单已下达 但订单本身必须保持完整 一般来说 有两种方法
  • SQL原型设计:面对使用varchar(N)静默截断数据——有更好的选择吗? (天数据)

    情况 varchar 20 好像默默地截断在 Teradata 和not当遇到长度超过 20 个字符的字符串时扩展或抱怨 这有点令人惊讶 因为我预计列会自动扩展以适应更大的字符串 例如 30 个字符 或者如果更大的字符串会抛出错误遇到字符串
  • Bigtable数据库设计理论

    我非常精通关系数据库设计的理论和实践 我知道什么有效 什么无效 什么是高性能的 什么是可维护的 几乎 当您开始拥有真实数据时 总是有需要调整的地方 看来我找不到关于分布式可扩展数据库的大量知识 例如 Google 的 Bigtable 用于
  • 我应该设计一个 SQL Server 数据库来依赖 UNION 还是避免它?

    执行以下 SQL 查询 SELECT Account Amount AS Deposit 0 00 AS Withdrawal Date FROM Deposits WHERE Account Account UNION SELECT Ac
  • 事件源和 SQL Server 多个关系表

    我们使用 SQL Server 2016 的事件源 我们有完整的客户产品应用程序 每个应用程序都标记为CustomerId并在事件商店中获取单个指南行项目 这是写入事件存储指南的主要标识符 产品应用程序附带许多不同的关系事物 没有引导 但有
  • 如何定义基于标签的组织结构?

    原标题 有没有办法在基于标签的组织方法上强制建立关系结构 我有一些实体 它们有一系列属性 一些属性影响实体可以具有的其他属性 许多属性被组织成组 并且有时实体被要求具有来自某些组的一定数量的属性 或者可能具有来自某些组的一定范围的属性 有没
  • 如何设计多租户mysql数据库[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 假设我需要设计一个数据库来托管多个公司的数据 现在 出于安全和管理目的 我需要确保不同公司的数据正确隔离 但我也不想启动 10 个 m
  • 字符集和排序规则到底是什么意思?

    我可以阅读MySQL文档而且非常清楚 但是 如何决定使用哪种字符集呢 校对对什么数据有影响 我要求解释这两者以及如何选择它们 来自 MySQLdocs http dev mysql com doc refman 5 0 en charset
  • 在 django 中创建“历史”类型模型的最佳方法是什么?

    我想为我的 Django 应用程序创建一个类似于 Django 管理员的 最近操作 的功能 以便存储其他模型的历史信息 例如 假设我有两个模型 分别称为 Book 和 Author 我想要第三个模型来存储信息 例如由谁以及何时对模型中的给定
  • 如何使用 django 更新会计应用程序中的余额?

    我正在学习 Django 尝试制作一个会计应用程序来跟踪我的开支等 我使用两种模型创建数据库 一种用于帐户 一种用于操作 但我不知道如何在每次操作时更新我的 余额 我在想 也许每次我保存一个新操作时 我都会通过覆盖操作模型的保存方法来更新余

随机推荐

  • Sequelize:如何在使用左外连接的连接表上执行 WHERE 条件

    我的数据库模型如下 员工驾驶一辆或零辆车辆一辆车可以由一名或多名员工驾驶车辆有一个模型类型 可以告诉我们它的燃料类型以及其他信息 我想要续集为我找到所有不开车的员工 或者如果他们开车 那么车辆不是柴油车 因此 其中 VehicleID 为
  • 带有 SharePoint 参数的 VB.Net 命令行(控制台)程序

    我想在 VB net 中创建一个允许参数的控制台程序 我想要做的是在下面的代码中添加参数 以便可以从 运行 菜单创建 Web 部件页面 例如C MyProgram exe Design 这将创建 Design Webpart 页面 我尝试在
  • 删除图中的文本

    我正在使用绘图功能sizetree from library plotrix 版本 3 8 1 这个函数有一个showcount允许括号中的一些计数显示在绘图上的参数 见下图 但我想知道为什么当我使用showcount FALSE 它们周围
  • Python 游戏网络

    我目前在寻找网络游戏编程资源时遇到困难 特别是Python 我不知道任何其他语言 我在 Python 中发现了很多关于通用网络的东西 但我不确定这就是我需要的 因为我相信游戏网络还涉及一些其他因素 我正在尝试创建一个在不同计算机上玩的 2
  • Python。如何使用libxml2获取属性值

    我使用的是 MINIDOM 但它不提供 xpath 方法 我现在尝试使用 libxml2 但在检索属性值时遇到问题 我的 xml 摘录如下
  • jersey 2.3.1 和 spring 集成兼容性问题

    我正在尝试创建将使用球衣和弹簧的宁静服务项目设置 我最初下载了 jersey1 8 依赖的 jar 我还得到了 jersey spring 1 8 并且我使用 com sun jersey spi spring container serv
  • 如何使用一对 FrameLabels 制作绘图网格?

    创建行 列 网格图 整个网格具有单个 FrameLabel 的最简单方法是什么 我需要类似的东西 p ListPlot RandomInteger 10 5 Joined gt True Axes gt False Frame gt Tru
  • Google 地图 API 3 搜索框

    我不知道如何在我的谷歌地图中实现搜索框 我有它 用户可以从表单中选择一些内容 然后在地图上加载标记 现在我想添加他们可以使用谷歌搜索框输入城市和州的位置 例如在maps google com上 这可以通过 API v 3 来完成吗 Goog
  • Eclipse:选择不包含任何可以在服务器上运行的资源

    我无法将 Maven Java Web 应用程序项目运行到 Eclipse IDE 中配置的 Tomcat 最初 我可以右键单击该项目并在 tomcat 服务器上运行它 但自从我将项目共享到存储库后 我无法执行此操作 我从存储库中断开了项目
  • 确定 JS AudioContext.analysisrNode 中的频率

    背景 我的目标是创建一个基于 JavaScript 的 Web 应用程序来分析和显示音频源 包括页内源 中的频率信息
  • 当理论规定使用已检查异常时,我是否应该使用相关的内置未检查异常?

    SO 上有很多关于 检查与非检查异常 主题的帖子 这个答案 https stackoverflow com a 19061110 2520359可能是最全面 信息最丰富的 然而 我仍然对遵循那里提出的逻辑感到矛盾 这是有原因的 我正在围绕一
  • 我应该在我的应用程序中包含命令行模式吗?

    出于学习目的 我正在 C 和 winforms 中开发一个类生成应用程序 我认为包含允许在脚本中使用应用程序的命令行模式可能会很好 在我的应用程序中包含命令行模式是一个很好的做法吗 最好有两个不同的程序 一个带有 GUI 一个用于命令行 实
  • 如何使 Flask/Jinja2 加载可执行 zip 存档中的捆绑模板?

    我已将 Flask Web 应用程序打包成可执行的 Python 压缩存档 zipapp https docs python org 3 6 library zipapp html 我在加载模板时遇到问题 Flask Jinja2 无法找到
  • 如果 ASP.NET 破坏了 DIV 的 ID,如何从 javascript 访问该 DIV?

    我有一个包含 div 元素的网页 在页面上 有 javascript 来引用 div document getElementById divId 在另一位开发人员重新设计该页面以使用 ASP 母版页之前 该方法一直运行良好 Now docu
  • 流复制和逻辑复制的区别

    有人能告诉我更多关于 PostgreSQL 中物理复制和逻辑复制之间的区别吗 TL DR 逻辑复制发送逐行更改 物理复制发送磁盘块更改 逻辑复制对于某些任务更好 而物理复制对于其他任务更好 请注意 在 PostgreSQL 12 更新时的当
  • Rails 购物车 - 未添加到当前订单

    这里是 Rails 菜鸟 我正在构建一个基本的购物车 它之前运行良好 在不更改任何代码的情况下 我 git reset hard 到我以前的提交 它正在工作 它就崩溃了 这是细分 Github 仓库 https github com chr
  • 编译引用的dll

    使用VS2005和VB NET 我有一个项目 它是我创建的数据存储的 API 编译时创建api dll 我在同一解决方案中有第二个项目 它有一个对 API 项目的项目引用 编译时将创建wrapper dll 这基本上是特定于应用程序的 AP
  • 显示对象而不是字符串

    在这里 我附上了我的问题的快照和代码 它只向我显示作为对象的内容 但完美地显示组名 这个问题的快照在下面的链接中给出 只需浏览这张图片 http imageupload org d 4DA941521 快照 gt 我想要特定组名称的子数据
  • 使用 kafka 进行 Spark 结构化流处理只会导致一批(Pyspark)

    我有以下代码 我想知道为什么它只生成一批 df spark readStream format kafka option kafka bootstrap servers IP option subscribe Topic option st
  • 如何设计一个数据库来存储属性,通过同义词选择属性

    我正在为房地产应用程序设计一个数据库 事实证明 它比我预期的更复杂 也许我把事情复杂化了 这些问题本质上是由于以下因素的存在造成的 同义词 例如 术语 公寓 公寓和顶层公寓本质上都指的是同一类型的房产 属性 不同的属性类型有不同的属性 例如