我正在Account
我的项目数据库中创建一个表。每个帐户都有很多属性:
- 登录
- 电子邮件
- 密码
- 生日
- 国家
- 头像网址
- 城市
- 等等
它们中的大多数都是可以为空的。我的问题是,我应该如何在数据库中设计这个?
它应该是一张包含所有这些属性的表吗?或者也许我应该创建两个表,比如AccountSet
和AccountInfoSet
,我将在其中存储所有那些“高级”用户的设置?最后但并非最不重要的一点是:如果这应该是两个表,那么这些表之间应该有什么样的关系?
我正在Account
我的项目数据库中创建一个表。每个帐户都有很多属性:
它们中的大多数都是可以为空的。我的问题是,我应该如何在数据库中设计这个?
它应该是一张包含所有这些属性的表吗?或者也许我应该创建两个表,比如AccountSet
和AccountInfoSet
,我将在其中存储所有那些“高级”用户的设置?最后但并非最不重要的一点是:如果这应该是两个表,那么这些表之间应该有什么样的关系?
如果这是一个关系数据库,那么我绝对不会将这些属性作为字段存储在 Account 表中。一些原因:
一旦您的应用程序投入生产(或者可能已经存在),架构维护将成为一场噩梦。您绝对会添加更多属性,并且必须在生产中不断触摸该表将是痛苦的。
您很可能会得到孤立的字段。我已经多次看到这种情况,您将引入一个属性然后停止使用它,但它已融入您的架构中,您可能太害怕而无法删除它。
理想情况下,您希望避免在表中包含此类稀疏数据(大量字段包含大量空值)。
我的建议是做你已经在考虑的事情,那就是为 Accounts 引入一个属性表。您将其称为 AccountInfoSet。
该表应如下所示:
AccountId int、属性 nvarchar(50)、值 nvarchar(50)
(当然,您可以根据需要设置数据类型和大小。)
然后,您将加入 AccountInfoSet 表,并可能以“高级”属性为轴 - 使用查询将行转换为列。
在 .NET 中,您还可以编写一个存储过程,通过一次调用返回两个查询并查看 DataSet 对象中的表。
或者你可以只打两个单独的电话。一个用于帐户,一个用于属性。
获取信息的方法有很多,但如果您使用的是关系数据库,请确保不要只向 Account 添加字段。