Sql-Server
使用繼承創建表
我對 SQL 很陌生。我只是想從頭開始創建一個數據庫來學習。
所以我有一個名為 Addresses 的表,我想創建兩個依賴於它的表,它們是 Country 和 State,我不確定要使用什麼腳本。
提前致謝
我不確定我是否會認為這是一個繼承問題,從描述中,我會說地址表將依賴於其他兩個表,而不是這兩個表依賴於地址表。
但除了這些細節,我建議:
- 如果您只儲存美國或美國和加拿大地址,那麼您可以創建一個“StateRegion”表。但在這種情況下,您實際上並不需要 Country 表。
- 如果您要儲存來自多個國家/地區的地址,那麼您需要一個 Country 表,但 StateRegion 表比較棘手,因為國家之間的差異很大。我將不得不看看是否有一個標準化的列表。
- 如果您想嘗試“StateRegionProvince”表,請查看 ISO 3166-2 上的此資訊:http ://en.wikipedia.org/wiki/ISO_3166-2
- 對於國家/地區,國家/地區表應該只是國家/地區的 ISO 列表。實際上不需要單獨的 ID 欄位,因為 ISO 國家程式碼是可接受的標準(因此 ISO 中的“S”:-)。只需將 CountryCode(我更喜歡 2 字元程式碼而不是 3 字元程式碼)設置為 CHAR(2) NOT NULL。
- 2 個字元程式碼的完整 ISO 3166-1 列表(最新):https ://www.iso.org/obp/ui/#search
- 2 和 3 字元程式碼的 ISO 列表:http: //www.nationsonline.org/oneworld/country_code_list.htm
- ISO 3166-1 和其他列表:http ://www.geonames.org/countries/
- 如果儲存非美國/加拿大專用地址:
對於“郵政編碼”,請為“郵政編碼”執行 VARCHAR(15) 欄位,因為也有多種方法可以執行這些操作。
- VARCHAR 很好,因為使用的唯一字元是:0-9、AZ、$$ space $$, 和$$ hyphen $$
- 郵政編碼一般資訊:http ://en.wikipedia.org/wiki/Postal_code
- 國家郵政編碼格式:http ://en.wikipedia.org/wiki/List_of_postal_codes
Address、City、StateRegion 等欄位使用 NVARCHAR 而不是 VARCHAR。
所以,一般來說:
CREATE TABLE County ( CountryCode CHAR(2) NOT NULL PRIMARY KEY, CountryName VARCHAR(100) NOT NULL ); CREATE TABLE Address ( AddressID INT IDENTITY(1, 1) NOT NULL PRIMARY KEY, UserID INT NOT NULL, -- FK to some User table AddressLine1 NVARCHAR(100) NOT NULL, AddressLine2 NVARCHAR(100) NULL, City NVARCHAR(100) NULL, StateProvince NVARCHAR(100) NOT NULL, -- or INT FK to StateProvince table? PostalCode NVARCHAR(20) NOT NULL, CountryCode CHAR(2) NOT NULL -- FK to Country table )
與其他方式相比,您更有可能讓 Address 表對 Country 和 State 表具有外鍵依賴關係。下面的內容向您展示了一種創建外鍵引用的方法。
當然,地址所需的欄位會根據您所在的國家/地區而有所不同;您可能需要研究不同的要求並相應地調整欄位。
CREATE TABLE Country ( CountryID INT NOT NULL PRIMARY KEY IDENTITY(1,1) , CountryName VARCHAR(500) NOT NULL , CountryCode VARCHAR(10) NOT NULL ) CREATE TABLE Addresses ( AddressID INT NOT NULL PRIMARY KEY IDENTITY(1,1) , AddressLine1 VARCHAR(1000) NOT NULL , AddressLine2 VARCHAR(1000) NULL , City VARCHAR(20) NOT NULL , [State] CHAR(2) NOT NULL , Country INT NOT NULL REFERENCES Country(CountryID) )