假设我有一个MySQL数据库,其中有一个用户表:
|ID| Name| email |...
|1 | John| john@doe.com|...
我将有一个php页面,用户将选择与复选框的帮助下,在两个独立的兴趣领域不同的选项之间。对于这个例子,我们说:最喜欢的水果和汽车。
水果:苹果,柠檬,梨,香蕉。汽车:法拉利、奔驰、沃尔沃、宝马。现在我有两种可能:
1)。为每个水果和与每个用户关联的汽车创建一个列,如下所示:
|ID| Name| email |apple | lemon | pear | banana | ferrari | mercedes | volvo | BMW |
|1 | John| john@doe.com| 1 | 1 | 0 | 1 | 0 | 1 | 0 | 1 |
2)创建两个新表:fruits和cars。
|ID| Name |
| 1| Apple |
| 2| Lemon |
| 3| Pear |
| 4| Banana|
|ID| Name |
| 1| Ferrari |
| 2| Mercedes |
| 3| Volvo |
| 4| BMW |
然后创建一个名为user_fruit的关系表和一个名为user_cars的关系表。例句:
|ID_user| ID_fruit |
| 1 | 1 |
| 1 | 2 |
| 1 | 4 |
(注意水果id为3,梨没有出现,因为它没有被选中-> 0)
|ID_user| ID_car |
| 1 | 2 |
| 1 | 4 |
问题:我不知道哪种方法更好?第一个方法在第一次使用时很容易,但是一旦选项增加,表将有很多tinyint列。对于所有的关系,第二种方法在开始时比较困难,但更容易维护,除了当用户取消选中一个选项时,我觉得用php删除行不是很舒服,特别是在基于索引的表上。
我不知道是否有人面临过类似的任务,可以给我一些建议。
我真的不需要任何代码示例,因为我知道如何开发这两个选项,更像是我正在寻找的性能和维护方法。
干杯!
肯定是第二种方法。看一看数据库规范化。正如您所注意到的,在第一种方法中,您最终会得到一个包含许多"null"值的表,并且以后很难修改。
因为我讨厌有多个"只有10个条目"的表,所以我决定对ID进行编码
|ID | Name |
| 1001 | Ferrari |
| 1002 | Mercedes |
| 1003 | Volvo |
| 1004 | BMW |
| 2001 | Apple |
| 2002 | Lemon |
| 2003 | Pear |
| 2004 | Banana |
那么代码"知道"2xxx是水果,1xxx是汽车,等等。您甚至可以使用id-filter表来减轻负担
|ID | Family |
| 1000 | Cars |
| 2000 | Fruits |
这减少了大JOIN…加入……当您有大量的小"选项"表时,使用JOIN语句。这在性能方面很好,但代价是需要更大的ID空间(SMALLINT而不是TINYINT)
不是真正的数据库专业,但错误安全,您可以随时拆分表
第二种方法是在两个表上使用外键的最好和专业的方法。这样可以避免null值
首先,
|ID| Name| email |apple | lemon | pear | banana | ferrari | mercedes | volvo | BMW |
|1 | John| john@doe.com| 1 | 1 | 0 | 1 | 0 | 1 | 0 | 1 |
你将不得不只读取一行,然后你可以抓取数据,而在另一种方式,你读取多个表和多个行。此外,对于这种场景还有另一个概念,称为数据复制-无论您使用哪种方法,都必须规范化表/数据。你可以通过这个链接阅读相关内容。
希望这对你的决定有帮助。欢呼声