【问题标题】:Address table applied to Users and Stores应用于用户和商店的地址表
【发布时间】:2017-09-18 15:27:17
【问题描述】:

在一个数据库中,我有以下表格:

create table dbo.Stores ( 
  Id int not null
  Name nvarchar (120) not null
)

create table dbo.Users ( 
  Id int not null
  Name nvarchar (120) not null
)

每个用户或商店可以拥有: 1 - 一个物理地址; 2 - 一个网站或社交媒体地址。

我应该有地址和社交媒体表格吗?例如:

create table dbo.Addresses ( 
  Id int not null
  Street nvarchar (120) not null,
  PostalCode nvarchar (12) not null
  City nvarchar (40) not null,
  Latitude float null,
  Longitude float null
)

create table dbo.UserAddresses ( 
  UserId int not null,
  AddressId int not null
)

社交媒体、电话号码等也是如此......

我应该只将列添加到用户表吗?

更新 1

对于网站地址和社交媒体地址,我正在考虑使用以下内容:

create table dbo.UserWebAddresses ( 
  UserId int not null,
  WebAddressTypeId int not null,
  Value nvarchar(200) not null
)

create table dbo.WebAddressTypes ( 
  Id int not null,
  Name nvarchar(20) not null
)

这有意义吗?

【问题讨论】:

  • 我要指出的是,人们和公司通常有多个地址和不止一个社交媒体帐户。浮点数对于存储纬度(和经度)也很糟糕,因为它是一个不精确的数字,而纬度和经度是精确的。如果需要,您永远不会希望对这些数字进行四舍五入。此外,您的地址表中至少需要国家和可能的州。您可能有来自其他国家/地区的用户与您的国家接壤或兼职。
  • @HLHEM 关于纬度和经度我正在考虑使用十进制 (9,6)。你怎么看?
  • @HLGEM 关于社交媒体我可以有多种类型的联系人... Facebook、Twitter 等...我正在考虑拥有两个表:WebAddress 和 WebAddressType 所以一个用户可以有很多 WebAddresses 之一每种类型。有意义吗?

标签: sql sql-server database-design


【解决方案1】:

如果没有重复的行,则将这些列直接添加到 dbo.Stores 和 dbo.Users。如果它们可能重复,则创建一个新表并使用 FK。

CREATE TABLE dbo.Stores 
( 
  Id INT NOT NULL IDENTITY(1, 1) PRIMARY KEY,
  Name NVARCHAR(120) NOT NULL,
  Address_Id INT NULL
);

CREATE TABLE dbo.Users 
( 
  Id INT NOT NULL IDENTITY(1, 1) PRIMARY KEY,
  Name NVARCHAR(120) NOT NULL,
  Address_Id INT NULL
);

CREATE TABLE dbo.Addresses 
( 
  Id INT NOT NULL IDENTITY(1, 1) PRIMARY KEY,
  Street NVARCHAR(120) NOT NULL,
  PostalCode NVARCHAR(12) NOT NULL,
  City NVARCHAR(40) NOT NULL,
  Latitude FLOAT NULL,
  Longitude FLOAT NULL
);

ALTER TABLE dbo.Stores
  ADD CONSTRAINT Stores_Address_Id_FK FOREIGN KEY (Address_Id) REFERENCES dbo.Addresses(Id);

ALTER TABLE dbo.Users
  ADD CONSTRAINT Users_Address_Id_FK FOREIGN KEY (Address_Id) REFERENCES dbo.Addresses(Id);

如果我理解一切正确,我们也可以采用以下解决方案:

CREATE TABLE dbo.Stores 
( 
  Id INT NOT NULL IDENTITY(1, 1) PRIMARY KEY,
  Name NVARCHAR(120) NOT NULL,
  Address_Id INT NULL,
  Latitude FLOAT NULL,
  Longitude FLOAT NULL
);

CREATE TABLE dbo.Users 
( 
  Id INT NOT NULL IDENTITY(1, 1) PRIMARY KEY,
  Name NVARCHAR(120) NOT NULL,
  Address_Id INT NULL,
  Latitude FLOAT NULL,
  Longitude FLOAT NULL
);

CREATE TABLE dbo.Addresses 
( 
  Id INT NOT NULL IDENTITY(1, 1) PRIMARY KEY,
  Street NVARCHAR(120) NOT NULL,
  PostalCode NVARCHAR(12) NOT NULL,
  City NVARCHAR(40) NOT NULL
);

ALTER TABLE dbo.Stores
  ADD CONSTRAINT Stores_Address_Id_FK FOREIGN KEY (Address_Id) REFERENCES dbo.Addresses(Id);

ALTER TABLE dbo.Users
  ADD CONSTRAINT Users_Address_Id_FK FOREIGN KEY (Address_Id) REFERENCES dbo.Addresses(Id);

【讨论】:

  • 正如我在 cmets 中看到的,作者对他的设计一无所知。 1.“每个用户或商店可以拥有:1 - 一个实际地址;2 - 一个网站或社交媒体地址。” 2.“所以一个用户可以有许多 WebAddresses 每种类型之一”
猜你喜欢
  • 2011-12-11
  • 2011-05-23
  • 1970-01-01
  • 2019-05-05
  • 2012-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多