谷歌';大桌子';喜欢SQL中的数据吗?如何设计数据库?

谷歌';大桌子';喜欢SQL中的数据吗?如何设计数据库?,sql,Sql,我需要创建一个数据库,让人们在美国选择1-N个邮政编码 直观地说,最好是让用户有一行和一列邮政编码 我遇到的问题是,这就像42k列。我确信这超出了大多数SQL DBs列的上限 我可以为每个州准备单独的表格。然后会有500-5K列/表 我的意思是这是可行的,但整个事情似乎有点可笑 感谢所有的想法、评论等 还有,你知道在哪里可以得到邮政编码列表(可能按州分类?)?谷歌搜索出了一些过时的东西。到目前为止,我有用于实时验证的USPS API。但我只需要一个静态列表 谢谢大家。在任何数据库(包括BigQu

我需要创建一个数据库,让人们在美国选择1-N个邮政编码

直观地说,最好是让用户有一行和一列邮政编码

我遇到的问题是,这就像42k列。我确信这超出了大多数SQL DBs列的上限

我可以为每个州准备单独的表格。然后会有500-5K列/表

我的意思是这是可行的,但整个事情似乎有点可笑

感谢所有的想法、评论等

还有,你知道在哪里可以得到邮政编码列表(可能按州分类?)?谷歌搜索出了一些过时的东西。到目前为止,我有用于实时验证的USPS API。但我只需要一个静态列表

谢谢大家。

在任何数据库(包括BigQuery)中,您的描述都会显示一个表
UserZips
,每个
UserId
ZipCode
有一行

Bigquery不需要这样的结构。它支持行内的数组,所以您可以拥有用户选择的邮政编码数组

它还支持行内的记录,因此您可以拥有一个记录数组。每条记录可以有一个邮政编码和其他信息

在许多数据库中,包括BigQuery,您可能会发现JSON对象是合适的表示形式

尽管如此,首先想到的是一个包含用户和邮政编码的列的表。

在任何数据库(包括BigQuery)中,您的描述都建议一个表
UserZips
,每个
UserId
ZipCode
有一行

Bigquery不需要这样的结构。它支持行内的数组,所以您可以拥有用户选择的邮政编码数组

它还支持行内的记录,因此您可以拥有一个记录数组。每条记录可以有一个邮政编码和其他信息

在许多数据库中,包括BigQuery,您可能会发现JSON对象是合适的表示形式


尽管如此,首先想到的是一个表,其中包含一列用户和邮政编码。

这样的结构允许您根据需要添加尽可能多的邮政编码,并将尽可能多的邮政编码链接到尽可能多的用户


这样的结构允许您根据需要添加尽可能多的邮政编码,并将尽可能多的拉链链接到尽可能多的用户



但是为什么不为每个邮政编码设置一行呢?不要设置为列,而是设置为行。USPS API可能是获得该列表的最佳位置。此外,SQL的哪个版本?我不认为邮政编码可以是行,因为每次有新用户时,我都必须通过添加新列来修改表…“直观地说,似乎最好让用户成为行和邮政编码列”-绝对不是。邮政编码需要排成行。不,添加新用户时不必添加新列。您只需添加行。这是关系建模中多对多关系的一个教科书式示例,但为什么不为每个邮政编码创建一行表呢?不要创建列,而是创建行。USPS API可能是获得该列表的最佳位置。此外,SQL的哪个版本?我不认为邮政编码可以是行,因为每次有新用户时,我都必须通过添加新列来修改表…“直观地说,似乎最好让用户成为行和邮政编码列”-绝对不是。邮政编码需要排成行。不,添加新用户时不必添加新列。您只需添加行。这是关系建模中多对多关系的教科书示例请注意,Postgres还(非常有效地)支持数组和记录以及行中的记录数组。谢谢。我首先想到的是一个UserZip-table(user=PK,LinkedList-zips)?我想这样做只是为了分配array=num的邮政编码,这样我就不必随着偏好的变化而不断地重新分配了?@user:即使Postgres提供了我不推荐的所有内容。首先选择标准化模型。只有在绝对必要的情况下才去规范化。而且,为了增加@a_horse_和_no_name的内容,我真的想不出一个好的理由不使用规范化方法。从长远来看,你会为自己省去很多麻烦。不要让期望的解决方案驱动你的问题。从长远来看,你将是一个更快乐的露营者。请注意,Postgres还支持(非常有效地)数组和记录以及行中的记录数组。谢谢。我首先想到的是一个UserZip-table(user=PK,LinkedList-zips)?我想这样做只是为了分配array=num的邮政编码,这样我就不必随着偏好的变化而不断地重新分配了?@user:即使Postgres提供了我不推荐的所有内容。首先选择标准化模型。只有在绝对必要的情况下才去规范化。而且,为了增加@a_horse_和_no_name的内容,我真的想不出一个好的理由不使用规范化方法。从长远来看,你会为自己省去很多麻烦。不要让期望的解决方案驱动你的问题。从长远来看,你将是一个更快乐的露营者。对于PASGRESS,语法会有所不同。我也会考虑允许不仅仅是美国拉链。如果有一天你添加了加拿大地址,你就必须在你的ZIP表中做很多更改。只是一个想法。:-)转为博士后比我想象的要容易。只需将“int identity”列更改为“serial”列,并将nvarchar()类型更改为varchar()类型。不用担心语法。谢谢你的回复。这是大多数人一直在说的,我想我最终会同意。上面是T-SQL。对于Postgres来说,语法会有点不同。我也会反对
CREATE TABLE zipCodes ( 
   zipID int identity
  , zipcode varchar(5) NOT NULL
  , zipPlusFour varchar(4) DEFAULT '0000' 
  , CONSTRAINT PK_zipID PRIMARY KEY (zipID)
) ;

CREATE TABLE users (
  userID int identity
  , username nvarchar(20) NOT NULL
  , CONSTRAINT PK_userID PRIMARY KEY (userID)
) ;

CREATE TABLE xref_users_zips (
  userID int NOT NULL
  , zipID int NOT NULL
  , CONSTRAINT FK_userID FOREIGN KEY (userID) REFERENCES users(userID)
  , CONSTRAINT FK_zipID FOREIGN KEY (zipID) REFERENCES zipCodes(zipID)
) ;

INSERT INTO zipCodes (zipcode) 
VALUES ('00501'), ('00544'), ('00601')
;

INSERT INTO users (username)
  VALUES ('johndoe'),('robertbuilder'),('zaphodbeeblebrox')
;

INSERT INTO xref_users_zips (userID, zipID)
VALUES (1,1), (2,2), (3,3)
;

SELECT * 
FROM users u
INNER JOIN xref_users_zips xuz ON u.userID = xuz.userID
INNER JOIN zipcodes z ON xuz.zipID = z.zipID