目前,我正在设计一个订单输入模块(Windows.NET 4.0 应用程序和 SQL Server 2008),对于可以应用在多个地方的数据,我在两个设计决策之间犹豫不决。在这个问题中,我将具体提到地址。
地址可以被各种对象使用(如订单、客户、员工、装运等),它们几乎总是包含相同的数据(地址 1/2/3、城市、州、邮政编码、国家等)。最初,我打算将每个字段作为相关表中的列包含进来(例如,订单将包含地址 1/2/3、城市、州等,而客户也将包含相同的列布局)。但我的一部分想要将 DRY / 规范化原则应用于这种情况,即创建一个名为“地址”的表,在适当的表中通过外键引用它。
CREATE TABLE DB.dbo.Addresses
(
Id INT
NOT NULL
IDENTITY(1, 1)
PRIMARY KEY
CHECK (Id > 0),
Address1 VARCHAR(120)
NOT NULL,
Address2 VARCHAR(120),
Address3 VARCHAR(120),
City VARCHAR(100)
NOT NULL,
State CHAR(2)
NOT NULL,
Country CHAR(2)
NOT NULL,
PostalCode VARCHAR(16)
NOT NULL
)
CREATE TABLE DB.dbo.Orders
(
Id INT
NOT NULL
IDENTITY(1000, 1)
PRIMARY KEY
CHECK (Id > 1000),
Address INT
CONSTRAINT fk_Orders_Address
FOREIGN KEY REFERENCES Addresses(Id)
CHECK (Address > 0)
NOT NULL,
-- other columns....
)
CREATE TABLE DB.dbo.Customers
(
Id INT
NOT NULL
IDENTITY(1000, 1)
PRIMARY KEY
CHECK (Id > 1000),
Address INT
CONSTRAINT fk_Customers_Address
FOREIGN KEY REFERENCES Addresses(Id)
CHECK (Address > 0)
NOT NULL,
-- other columns....
)
从设计角度来看,我喜欢这种方法,因为它创建了一个标准的地址格式,很容易更改。例如,如果我需要添加Address4,我只需要在一个地方添加,而不是每个表都要添加。然而,我可以看到构建查询所需的JOIN数量可能会变得有些疯狂。
我想知道是否有任何企业级SQL架构师成功地使用过这种方法,或者这导致的JOIN数量会造成性能问题?