Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database design 如何设计数据库来存储属性,通过同义词选择属性_Database Design - Fatal编程技术网

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

Database design 如何设计数据库来存储属性,通过同义词选择属性,database-design,Database Design,我正在为一个房地产应用程序设计一个数据库。事实证明,这比我预想的要复杂得多(也许我把事情搞得太复杂了) 这些问题主要是由以下因素造成的: 同义词 例如,“公寓”、“公寓”和“顶层公寓”这三个术语基本上都是指同一类型的物业 属性(不同的属性类型具有不同的属性) 例如,公寓可以是底层或顶层等 最后,我为不同的房地产类型创建了一个相当(无意)复杂的分类树。树节点是特性类型的实际实例 我想创建一个数据库,这样我不仅可以使用任何同义词,还可以使用属性进行查询 例如,查询(在伪SQL中): 从synon

我正在为一个房地产应用程序设计一个数据库。事实证明,这比我预想的要复杂得多(也许我把事情搞得太复杂了)

这些问题主要是由以下因素造成的:

  • 同义词 例如,“公寓”、“公寓”和“顶层公寓”这三个术语基本上都是指同一类型的物业
  • 属性(不同的属性类型具有不同的属性) 例如,公寓可以是底层或顶层等
最后,我为不同的房地产类型创建了一个相当(无意)复杂的分类树。树节点是特性类型的实际实例

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

例如,查询(在伪SQL中):

从synonym=“flat”和属性位于('ground floor'、'garden')的属性中选择*


应返回一份一楼有花园的公寓清单

有人能帮我设计数据库模式,以便允许上面描述的那种查询吗


最后但并非最不重要的一点,我将使用MySQl或PostgreSQL作为后端数据库,但更希望这种方法是不依赖数据库的-如果可能。

要处理同义词,可以在包含属性类型静态列表的表和包含同义词的表之间进行多对多查找。这样,一个同义词可以映射到多个属性类型

例如:

Table:Property Type
1 House
2 Appartment
3 Large House
4 Cave

Table:Synonym
1 house
2 flat
3 dwelling
4 condo
5 mansion

Table:PropertyType-Synonym
1 1 (House is a house
1 3 (House is a dwelling)
2 2 (Appartment is a flat)
2 3 (Appartment is a dwelling)
2 4 (Appartment is a condo)
3 1 (Large House is a house)
3 3 (Large House is a dwelling)
3 5 (Large House is a mansion)
4 3 (Cave is a dwelling)
Table:Property
1 Apartment F, Field House Gardens
2 123 Alphabet Street, NumberTown

Table:Attribute
1 Is ground floor?
2 Number of bedrooms
3 Has garden?

Table:Property-Attribute-Values
1 1 No
1 2 2
1 3 Yes
2 2 5 
2 3 Yes
对于属性,可以使用一种开放属性结构

例如:

Table:Property Type
1 House
2 Appartment
3 Large House
4 Cave

Table:Synonym
1 house
2 flat
3 dwelling
4 condo
5 mansion

Table:PropertyType-Synonym
1 1 (House is a house
1 3 (House is a dwelling)
2 2 (Appartment is a flat)
2 3 (Appartment is a dwelling)
2 4 (Appartment is a condo)
3 1 (Large House is a house)
3 3 (Large House is a dwelling)
3 5 (Large House is a mansion)
4 3 (Cave is a dwelling)
Table:Property
1 Apartment F, Field House Gardens
2 123 Alphabet Street, NumberTown

Table:Attribute
1 Is ground floor?
2 Number of bedrooms
3 Has garden?

Table:Property-Attribute-Values
1 1 No
1 2 2
1 3 Yes
2 2 5 
2 3 Yes

希望这有帮助

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

以下是快速ERD草图:

通过非常快速的数据字典:

物业
是一块不动产

类别
是描述性属性的集合。这张表的重点是作为属性的组织者,而不是其他任何东西。它可以包括诸如“财产类型”、“所有权结构”、“浴室数量”以及其他可能感兴趣的内容

属性
是一种特定的关注质量。请注意此实体类型上的渐开线关系。稍后我会详细讨论这个问题。主要的一点是,属性可以更一般或更具体,一些属性可以看作是其他属性的细化

DESCRIPTOR
是一个属性和与该特定房地产相关联的属性的交集

那么这有什么帮助呢?

关键是属性如何工作。如果使用嵌套集模型,则可以处理或多或少特定的属性和搜索条件。考虑下面一个潜在的类别及其相关属性的图表:

在本例中,类别为“财产类型”。从图中可以看出,该类别中的属性有层次分解。图中的每个框都是“记录在”属性。包含其他框的框具有子属性。位于另一个框中的框对其包含框具有FK,以此类推

这样,你可以说“我想找一个顶层公寓”。然后,您可以找到具有指向“Penthouse”属性的相关描述符的属性记录。这很容易。但是如果你的搜索结果是空的呢

这种方法的优点是,你可以放松你的标准,说“让我们从属性层次结构上升到下一个比顶层公寓更不具体的东西”。在我的例子中,这就是“高层建筑”。现在您再次尝试搜索,您的运气可能会更好

这样的系统可以让你在每一类属性中尽可能具体,同时让其他属性放松到足以开始搜索的程度。这就是房地产经纪人的工作,不是吗?帮助客户做出必要的妥协,以找到最适合其最重要标准的方案

处理嵌套集

这种方法唯一棘手的部分是如何处理嵌套集。有很多方法可以做到这一点,其中许多已经在其他地方得到了彻底的记录。我自己也喜欢这种技术,尤其是对于相对静态的数据集。这使得为某些给定属性或其任何子属性查找匹配项非常容易,而不必在SQL中执行任何外来操作

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

OP问你如何处理诸如卧室数量和查询是什么样的事情?让我们再举一个例子来说明:

上面显示了“卧室数量”类别的嵌套集。我还将探视号码添加到图表中。请注意访问编号的工作方式,特别是请注意,任何给定属性值的左(绿色)和右(红色)编号包含任何从属属性的左和右访问编号。例如,“2+卧室”的左右数字分别为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')
选择P.*
从属性P
内部连接描述符D
在P.id=D.property\u id上
内托梁