我使用的是PHP和MySQL,在数据库设计方面经验不足。我知道规范化的基本原理,但我的问题是如何存储特定形式的值。
好的,按照我的页面设置方式,有一些文本框可以动态添加或删除。如果用户按下"+"或"-"按钮,则会添加或删除另一个文本框。
无论如何,当我通过$_POST提取文本框值时,它是一个数组,然后我使用内爆()将其转换为字符串。例如:用户输入"hello"world"bye"world",内爆将其转换成以下字符串"hello,world,bye,world"。
我的问题是,将这个字符串"hello,world,bye,world"存储在1行中作为1个条目更好吗?还是将这个字符串分成4个单独的字符串并存储在4个不同的行中更好?每个文本框都将包含问题/评论,因此它们可能很长,很可能不是像我举的例子那样的一个单词。
我之所以这么问,是因为所有这些输入都将在同一个页面上使用,所以它们都可以共享一个唯一的ID。我只需要查询一次,而不是多次查询。
它们应该单独存储,因为它们是一种数据的单独示例。
您的表将是(例如)comments
,每一行都应该是一个注释,因此一行用于hello
,一行用于world
,等等。
你也可以在注释旁边存储一个页面ID,所以你的表看起来是这样的(注意,注释ID通常也有一个id
字段。为了简洁起见,我省略了它):
|--------------|---------|
| comment | page_id |
|--------------|---------|
| hello | 1 |
| world | 1 |
| bye | 2 |
|--------------|---------|
然后,您仍然可以在page_id上搜索,但您的数据在逻辑上是分开的,如果您愿意,您可以在特定的注释上搜索。
SELECT * FROM comments WHERE page_id = 1 -- 2 results
您还可以很容易地按照字母顺序或时间(为此添加一个新列)对其进行排序。
|--------------|---------|------------|
| comment | page_id | time_made |
|--------------|---------|------------|
| hello | 1 | 1234567890 |
| world | 1 | 2356480546 |
| bye | 2 | 5168161543 |
|--------------|---------|------------|
SELECT * FROM comments WHERE page_id = 1 ORDER BY time_made DESC -- most recent first
最好将此字符串分成4个单独的字符串,并将其存储在单独子表的4个不同行中。