假设我有一个带有如下用户表的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)创建两个新表:水果和汽车。
|ID| Name |
| 1| Apple |
| 2| Lemon |
| 3| Pear |
| 4| Banana|
|ID| Name |
| 1| Ferrari |
| 2| Mercedes |
| 3| Volvo |
| 4| BMW |
然后创建一个名为user_fruit的关系表,另一个名为user_cars。 E.g:
|ID_user| ID_fruit |
| 1 | 1 |
| 1 | 2 |
| 1 | 4 |
(请注意,水果ID 3,Pear未显示为未选中 - > 0)
|ID_user| ID_car |
| 1 | 2 |
| 1 | 4 |
问题: 我不知道哪种方法更好?第一个是第一手容易的,但是一旦选项增长,该表将包含许多 tinyint 列。 第二个在开始时对所有关系都比较困难,但是更容易维护,除非用户取消选中一个选项,我觉得通过php删除行感觉不太舒服,特别是在基于索引的表上。
我不知道是否有人遇到过类似的任务,可以给我一些建议。
我真的不需要任何代码示例,因为我知道如何开发这两个选项,更多的是我正在寻找的性能和维护方法。
干杯!
答案 0 :(得分:5)
绝对是第二种方法。看看database normalization。正如您所指出的那样,在您的第一种方法中,您最终会得到一个包含许多“空”值的表,并且以后很难修改。
答案 1 :(得分:1)
由于我讨厌有多个“只有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 ... JOIN语句。这是一个很好的性能,代价是更大的ID空间要求(SMALLINT而不是TINYINT)
不是真正的数据库专家,但是错误安全,你可以随时拆分表。
答案 2 :(得分:0)
第二个是在两个表上使用外键的最佳和专业方式。这样就可以避免使用空值。
答案 3 :(得分:0)
以第一种可能的方式,
void foo(int i, int j, const std::function<int(int, int)> f) { /* ... */ }
// ...
const auto foo1 = std::bind(foo, std::placeholders::_1, std::placeholders::_2, f1);
const auto foo2 = std::bind(foo, std::placeholders::_1, std::placeholders::_2, f2);
您必须只读取一行,然后您可以获取数据,而另一种方式是读取多个表和多行。此外,还有另一种称为数据复制的场景概念 - 您使用表/数据的方法必须规范化。你可以阅读this with this link。
希望这对您的决定有所帮助。干杯