我有一个名为Table1的表,它有大约20列。这些列中有一半是字符串值,其余列是整数。我的问题很简单:什么更好,将所有列只放入一个表中,还是将它分配到2,3或甚至4个表中?如果是这样,我必须使用LEFT JOIN加入他们。
什么是最佳选择?
由于
答案 0 :(得分:1)
" best"取决于表的使用方式。所以,这个问题没有真正的答案。我可以说20列不是很多,很多非常合理的表有20多列混合类型。
第一个观察:如果你问这样一个问题,你有一些SQL的知识,但没有深入的知识。一张桌几乎肯定是要走的路。
有什么可能改变这个建议?如果许多整数列都是NULL
- 比如90%的记录都将NULL
列为全部 - 则那些NULL
值可能只是在数据页面上浪费空间。通过消除这些行并将值存储在另一个表中,可以减小数据的大小。
字符串值也是如此,但需要注意。整数占用至少4个字节,而可变长度字符串可能更小(取决于数据库存储它们的确切方式)。
另一个原因是如何通常使用数据。如果查询通常仅使用少量列,则将每列存储在单独的表中可能是有益的。说实话,关键列的开销通常会超过任何节省。并且,这样的数据结构对于更新,插入和删除确实很糟糕。
但是,这在Paraccel,Amazon Redshift或Vertica等列式数据库中变得非常实用。这样的数据库内置了对这种分裂的支持,它可以对性能产生一些非常显着的影响。
答案 1 :(得分:0)
通过users
表 -
1) `users` - id, name, dob, city, zipcode etc.
2) `users_products` - id, user_id(FK), product_name, product_validity,...
3) `users_billing_details` - id, user_id(FK to `users`), billing_name, billing_address..
4) `users_friends` - id, user_id(FK to `users`), friend_id(FK to same table `users`)
因此,如果有很多关系,请使用MANY-to-MANY关系。如果很少有关系使用同一个表。一切都取决于你的结构和要求。
建议 - 多对多使您的数据结构更加灵活。
答案 2 :(得分:0)
一张表中可以有20列。没有错。但是你确定你正在正确地设计结构吗?
将来有些数据会发生重大变化吗?
表是否试图封装单个活动或实体?
该表是否具有与域相关的单一含义,还是封装了多个实体?
是否可以将结构简化为每个表具有单一含义的较小表,然后"关系"通过主键/外键添加?
这些是您在设计数据库时考虑的一些问题。
如果您找到这些问题的答案,您将了解自己是应该有一张桌子还是多张桌子?