2

我仍然是数据库、规范化等方面的新手,我可能需要一些帮助。这里附上我的数据库结构的一部分,我认为我的方法是个坏主意。在这里,我们的国家可以分为不同的省,所有的城市/城镇都在一个特定的省和一个描笼涯(我猜最接近外行人的术语是地区)。因此,如果在我们国家的所有地方,无论您身在何处,您都必须拥有特定的描笼涯、城市/城镇和省。我所做的是我使用外键来引用表格 barangay、城市/城镇、省。这是一个坏主意吗?

如果我创建一个tblCustomer_Address来分隔Country_ID: Int FK, Province_ID: Int FK, CityTown_ID: Int FK, Baranggay_ID: Int FKfrom会有多大不同tblCustomer

谢谢!

tblCustomer(
  Customer_Id: Int PK
  Customer_FName: String
  Customer_MName: String
  Customer_LName: String
  Country_ID: Int FK
  Province_ID: Int FK
  CityTown_ID: Int FK
  Baranggay_ID: Int FK
  Additional_Address_Details: String
 )
tblCountry(
  Country_Id: Int PK
  Country_Name: String
)
tblProvince(
  Province_Id: Int PK
  Province_Name: String
)
tblCityTown(
  CityTown_Id: Int PK
  CityTown_Name: String
)
tblBarangay(
  Barangay_Id: Int PK
  Barangay_Name: String
)

* 编辑:顺便说一句,我忘了提。我项目的一部分是生成报告,所以我想到的是跟踪位置。所以我想为描笼涯、城市/城镇、省份设置单独的表格,以使每个人都独一无二。

4

3 回答 3

0

非常糟糕,因为您必须维护国家、城市和地区的可用选项。

就个人而言,我只是创建了一个addresses数据库表,其中地址组件的字段符合 hCard 微格式:

CREATE TABLE IF NOT EXISTS `addresses` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `extended_address` varchar(128) DEFAULT NULL,
  `street_address` varchar(128) NOT NULL,
  `locality` varchar(128) NOT NULL,
  `region` varchar(128) DEFAULT NULL,
  `postal_code` varchar(128) DEFAULT NULL,
  `country_name` varchar(128) NOT NULL,
  PRIMARY KEY (`id`)
)
于 2012-06-21T08:46:16.927 回答
0

好吧,在我看来,一个城市或省将存在一个描笼涯,一个省将存在一个城市,一个国家将存在一个省。如果您有一个位置表,位置类型为 Barangay、City、Province、Rural 或 Country,并且 parentID 指向层次结构中的父位置,那么结构如何。然后您的客户有一个位置 ID 指向层次结构中的任何位置。可以将新位置添加为城市、省(农村)地区或国家中的现有位置。表看起来像这样:

tblLocation(
LocationID int PK,
ParentID int FK references tblLocation LocationID,
LocationType int FK references tbllocationTypes,
LocationName
)

无法将此添加为评论,因此这里有一个更完整的实现:

CREATE TABLE LocationType
(
    LocationTypeID int not null primary key,
    LocationTypeName varchar(20) not null unique
)
GO
CREATE TABLE Location (
    LocationID int not null primary key,
    ParentId int null references Location (LocationID),
    LocationName varchar(100),
    LocationTypeID int not null references LocationType (LocationTypeID)    
)
GO
CREATE Table Customer (
    CustomerID int not null primary key,
    FirstName varchar(50),
    MiddleName varchar(50),
    LastName varchar(50),
    LocationID int references Location (LocationID)
)
GO
CREATE TABLE City(  
    CityID int not null primary key references Location (LocationID),
    PostCode varchar(20) not null
)
GO
CREATE VIEW DetailedLocation AS 
    SELECT L.*, C.PostCode FROM Location AS L
    LEFT OUTER JOIN City AS C
    ON C.CityID = L.LocationID
于 2012-06-21T08:50:01.653 回答
0

问题是您没有以正确的方式处理地址。如果您真的不需要完整地址(或者我只是在这里遗漏了这个?),那么在客户表中只有一个 Baranggay 字段将是“好的”。在任何其他情况下,您都应该有一个地址表,并且只需在客户表中引用 addressID。当然,除非客户应该能够拥有多个地址,在这种情况下,您应该为这种 m:n 关系引入一个 CustomerAddressRel 表。

无论如何,在这里将地址拆分为多个字段和/或表是没有意义的。一个特定的 barangay 将永远只属于一个城镇,那个城镇属于一个省,那个省属于一个国家(国家?如果这是关于多个国家,你需要不同的格式,因为 barangay 不是一个国际概念!)。因此,在地址中跟踪 baranggay 并有一个不同的表来保存 baranggay 所属的城镇和省份确实足够了。

很抱歉文字很长,但我觉得如果我提出一个修改后的方案,它对你一点帮助都没有。您需要了解某些决策的原因,然后根据您当前的数据集和预期范围做出最佳决策。如果您有可能走向国际,请确保数据方案现在已准备好。

编辑:

好吧,我觉得还是放下它是最好的。如果您想要面向未来和灵活,至少只要您限制在菲律宾并且 Barangay 属于一个城镇:

tblCustomer(
    Customer_ID: Int PK
    Customer_FName: String
    Customer_MName: String
    Customer_LName: String
)

tblCustomerAddressRel(
    Customer_ID: Int FK
    Address_ID: Int Fk
    Type: (Mailing, Billing, Historic,...)
)

tblAddress(
    Address_ID: Int PK
    Baranggay_ID: Int FK
    Additional_Address_Details: String (<< this looks like a bad idea btw)
)

tblCountry(
    Country_ID: Int PK
    Country_Name: String
)

tblProvince(
    Province_Id: Int PK
    Province_Name: String
    County_ID: Int FK
)
tblCityTown(
    CityTown_ID: Int PK
    CityTown_Name: String
    Province_ID: Int FK
)
tblBarangay(
    Barangay_ID: Int PK
    Barangay_Name: String
    CityTown_ID: Int FK
)
于 2012-06-21T08:52:10.560 回答