1

我试图弄清楚我正在制作的数据库要使用什么样的规范化和结构。它将是一个属性列表(建筑编号街道地址、街道名称、城市、州、邮政编码、单元号)。

从那里,我打算用各种信息制作一张桌子。然后我将有一个中间表来连接所有信息并进行记录。据我所知,几乎每一列都会被多值除单元号之外。所以,我认为需要完全标准化:

Table building_number
---------------------
building_number_id int primary key auto index not null
buildind_namber tinyint

Table city
--------------------
city_id building_number_id int primary key auto index not null
city_name varchar(30)

Table state
--------------------
state_id building_number_id int primary key auto index not null
state_name varchar(30)

Table zip
---------------------
zip_id building_number_id int primary key auto index not null
zip_name varchar(30)

Table building_name
---------------------
building_name_id int primary key auto index not null
building_name varchar(50)

Table owner
---------------------
owner_id int primary key auto index not null
owner_name varchar(30)


Table info
----------------------
info_id int primary key auto index not null
rent tinyint
condition varchar(10)
comment varchar(1000)

Intermediate table
--------------------------
building_number_id int 
street_id int 
city_id int 
state_id int 
building_name_id 
owner_id 
info_id 
(all these keys are foreign keys referencing their respected tables/primary keys)

我将创建一个 html 搜索文本框,它将接受动态输入并根据给出的任何内容提取查询...完整的确切地址、街道名称或建筑物编号街道名称城市等。我还没有开发我的搜索 mysql算法呢。我只是在创建我的数据库的开始阶段。

我将使用 innodb 引擎和 b-tree 索引。我将索引除评论之外的每一列,因为我将进行这些动态输入搜索(如谷歌)。

作为一个业余爱好者,我正在为自己做这件事。正因为如此,我更喜欢从头开始手动操作,而不是使用一些框架或插件。

对于我正在做的事情,这个数据库设计和规范化是否正确?

4

1 回答 1

1

在创建表格时,您应该首先考虑实体,一般来说,实体是有形的东西。

有形事物的例子有:建筑物、所有者、联系人、城市、国家、时区。

另一方面,有些东西不是实体,而是实体的描述符。

描述符的示例有:身高、体重、门牌号和价格。

描述符通常是实体的属性。如果无法提前枚举所有可能的描述符,则这些可能不应该在表中。

您需要一个描述符查找表的情况通常是您可以接受的值类型受到限制。例如,“鞋码”可能看起来是开放式的,但也许您只制造某些尺寸,因此自由格式的输入字段并不实用。另一方面,“高度”最好存储为具有一组预定义单位的值,而不是具有所有可能高度的查找表。

在您的情况下,您需要一个“地址”实体,其中包含许多描述它的字段。诸如“建筑物编号”之类的内容应该是一个自由格式的输入字段。“A 楼”、“82 1/2”、“107B”、“3.7”、“4/9”和“44-290”都是有效的楼号。你应该只接受一个字符串。

同样,街道名称几乎不是您可以限定的东西。“绿道街”和“绿道街”一样吗?还是“格林威街”?有关系吗?可能不是,因为它只是一个描述符。您无法验证这些,并且几乎不可能将它们连接在一起,要使其大规模工作需要太多的按摩。

还要记住,有些地方需要两行、三行、四行甚至五行地址信息来标识一个位置。英国是这里最严重的违规者之一,正式地址将包含各种信息。

您可能应该做的是设计一个类似于“地址”的表格,其中包含以下字段:address1, address2, address3, address4, address5, city, region, country, postal_code。有了它,你可以覆盖他们会扔给你的大部分东西。看看谷歌地图返回的数据类型作为例子。

您似乎在暗示您的问题中存在某种一对多结构,其中一个地址可能有多个建筑物名称或编号。如果没有某种序列指示符,您将无法知道这些关联记录中的哪一个是第一个。这使事情变得非常复杂。

当担心标准化时,从最简单的可行的事情开始,并修复任何明显的错误。除非您有大量数据要处理,否则如果您没有过度使用规范化,您通常可以相当容易地调整您的架构。

于 2013-05-14T00:19:44.460 回答