数据库规范化和数据输入(管理员后端)

时间:2011-09-04 10:41:56

标签: php mysql database database-design

看看下面的items表,因为您可以看到此表未规范化。名称应该在一个单独的表中进行标准化。

mysql> select * from items;
+---------+--------+-----------+------+
| item_id | cat_id | name      | cost |
+---------+--------+-----------+------+
|       1 |    102 | Mushroom  | 5.00 |
|       2 |      2 | Mushroom  | 5.40 |
|       3 |    173 | Pepperoni | 4.00 |
|       4 |    109 | Chips     | 1.00 |
|       5 |     35 | Chips     | 1.00 |
+---------+--------+-----------+------+

此表未规范化,因为在后端管理站点上,工作人员只需选择一个类别并键入项目名称即可快速添加数据。这很快。有数百个相同的项目名称,但成本并不总是相同。

如果我将此表规范化为这样的话:

mysql> select * from items;
+---------+--------+--------------+------+
| item_id | cat_id | item_name_id | cost |
+---------+--------+--------------+------+
|       1 |    102 |            1 | 5.00 |
|       2 |      2 |            1 | 5.40 |
|       3 |    173 |            2 | 4.00 |
|       4 |    109 |            3 | 1.00 |
|       5 |     35 |            3 | 1.00 |
+---------+--------+--------------+------+
mysql> select * from item_name;
+--------------+-----------+
| item_name_id | name      |
+--------------+-----------+
|            1 | Mushroom  |
|            2 | Pepperoni |
|            3 | Chips     |
+--------------+-----------+

现在如何在管理员后端(数据输入的观点)添加项目(数据),因为该表已经规范化了?我不希望选择项目名称的下拉菜单 - 会有数千个不同的项目名称 - 需要花费大量时间才能找到项目名称,然后输入成本。

需要一种尽可能快速添加项目/数据的方法。这是什么解决方案?我用PHP开发了后端。

另外,编辑项目名称的解决方案是什么?工作人员可能会完全重命名项目名称,例如:Fish Kebab to Chicken Kebab,这将影响所有类别而不会意识到它。会有一些拼写错误可能需要修正,比如F1sh Kebab应该是Fish Kebab(这在表格规范化时很有用,我会看到项目名称在每个类别都更新)。

5 个答案:

答案 0 :(得分:2)

  

我不希望选择项目名称的下拉列表 - 会有数千个不同的项目名称 - 需要花费大量时间才能找到项目名称,然后输入成本。

除了下拉框之外,还有用于选择现有项目的选项。您可以使用自动完成功能,只接受已知值。我只是想明确有一些UI友好的方法来实现你的目标。

至于是否这样做,这取决于你。如果产品名称略有不同,那是一个问题吗?像这样的小数据完整性问题是否可以通过批处理作业或类似问题进行纠正?

根据系统的设计,首先确定您的数据应该是什么样子。在做出决定后,担心构建UI的最佳方法。就像我说的,无论您的数据结构如何,都有可行的方法来设计UI。

答案 1 :(得分:1)

我认为您最好使用当前的设计,因为您的名称是产品名称而不是类别名称,您可能希望避免重命名单个产品一次重命名过多的情况。

规范化是一件好事,但您必须根据您的特定需求进行衡量,在这种情况下,我真的不会像上面所示添加额外的表item_name。

只是我的两分钱:)。

答案 2 :(得分:0)

您的表应该表示哪些依赖项?有什么关键?根据你所说的,我不知道你的第二个设计是如何更正常化的。

假设第一个设计中“name”的决定因素与第二个设计中“item_name_id”的决定因素相同?如果是这样,那么将名称移动到另一个表格将不会对您的项目表满足的正常表格产生任何影响。

用户界面设计与数据库设计无关。您不能让UI驱动数据库设计并期望获得明智的结果。

答案 3 :(得分:0)

您需要在添加数据之前验证数据并检查是否存在,以查看它是否为新值。

$value = $_POST['userSubmittedValue']

//make sure you sanitize the variable (never trust user input)

$query = SELECT item_name_id 
         FROM item_name 
         WHERE name='$value';

$result = mysql_query($query);
$row = mysql_fetch_row($result);

if(!empty($row))
{
//add the record with the id from $row['item_name_id'] to items table
}
else
{
//this will be a new value so run queries to add the new value to both items and item_name tables
}

答案 4 :(得分:0)

  

需要一种尽可能快速添加项目/数据的方法。是什么   解决这个问题?我用PHP开发了后端。

用户界面问题和数据库结构是不同的问题。对于给定的数据库结构,通常有几种用户友好的方式来呈现和更改数据。数据完整性来自数据库。用户界面只需知道在哪里可以找到唯一值。程序员决定如何使用这些唯一值。您可以使用下拉列表,弹出搜索表单,使用自动完成,比较用户键入的数组与数组中的元素,或查询数据库以查看该值是否已存在。

根据您的描述,听起来您首先要快速添加数据:“工作人员只需选择一个类别并输入项目名称即可快速添加数据”。 (用“1”代替“蘑菇”与标准化没有任何关系。)

  

另外,编辑项目名称的解决方案是什么?工作人员可能   完全重命名项目名称,例如:Fish Kebab to Chicken   烤肉串,这将影响所有类别而不会意识到它。

您允许错误的人编辑项目名称。严重。

这种问题出现在每个数据库应用程序中。只允许受过培训且值得信赖的人进行这些更改。 (请参阅有关GRANT和REVOKE的dbms文档。另请参阅ON UPDATE RESTRICT。)

在我们的工作生产数据库中,我可以插入新状态(对于美国),我可以将现有状态名称更改为我想要的任何状态。但如果我把“阿拉巴马”改为“吉尔吉斯斯坦”,我就会被解雇。因为我应该知道比做那样的事情更好。

但即使我是管理员,我也无法编辑旧金山地址并将其邮政编码更改为“71601”。数据库“知道”'71601'不是旧金山的有效邮政编码。也许您也可以在数据库中添加一两个表。我无法从你的描述中看出这样的事情会对你有所帮助。

在我不是管理员的系统上,我希望没有权限将行插入状态表。在其他表中,我可能有权插入行,但不能更新或删除它们。

  

可能会有一些拼写错误,需要像F1sh一样纠正   烤肉串应该是鱼烤肉串

课程是一样的。应该允许某些人更新items.name,而有些人则不应该。撤消权限,限制级联更新,使用更多表增加数据完整性或增加培训。