Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
复制MySql列值与外键-最佳实践_Mysql_Sql_Database - Fatal编程技术网

复制MySql列值与外键-最佳实践

复制MySql列值与外键-最佳实践,mysql,sql,database,Mysql,Sql,Database,我们目前正在开发我们自己的电子商务解决方案,作为我们研究的一部分,我们一直在检查ZenCart数据库模式,发现数据在不同的表之间非常频繁地重复,似乎一个外键就足以链接两个或多个相关表,例如: 假设存在具有以下列的表产品 产品\u IDPRODUCT\u名称产品\u价格产品\u SKU 然后,如果有一个Sales_Item表,那么当然可以通过执行以下操作来引用产品及其所有组成列: SALES\u ITEM\u IDProducts\u PRODUCT\u ID//这是将特定产品与销售项目关联的外键

我们目前正在开发我们自己的电子商务解决方案,作为我们研究的一部分,我们一直在检查ZenCart数据库模式,发现数据在不同的表之间非常频繁地重复,似乎一个外键就足以链接两个或多个相关表,例如:

假设存在具有以下列的表产品

产品\u IDPRODUCT\u名称产品\u价格产品\u SKU

然后,如果有一个Sales_Item表,那么当然可以通过执行以下操作来引用产品及其所有组成列:

SALES\u ITEM\u IDProducts\u PRODUCT\u ID//这是将特定产品与销售项目关联的外键。sale\u特定数据的sale\u TIMEREST\u

但是,Sales表似乎复制了Products表中定义的许多字段值,因此实际上如下所示:

销售商品产品名称产品价格产品销售时间


我的问题是,在尝试构建一个可扩展的高效解决方案时,哪种方法通常被视为最佳实践。使用外键意味着数据不会重复,但需要注意的是,为了查询整个数据集,需要数据库或应用程序级别的联接。然而,由于某种原因,外键方法似乎更干净、更正确

我相信你看到的是电子商务的商业案例。销售时,sales表将捕获与该特定销售相关的信息。例如,如果您在销售时未捕获销售价格,则每次使用新产品价格更新产品表时,您的销售历史记录都会更改。是的,我了解捕获的销售特定详细信息,但我的问题是,为什么产品表product_ID中已定义的产品字段I,e字段,在销售项目表中再次定义产品名称等-这些字段不太可能更改?不太可能不等于从不。愤世嫉俗或经验丰富的系统管理员和DBA会告诉您,当客户机告诉您某些东西不太可能改变时,这意味着它肯定会改变,事实上它可能已经改变了。在关系术语中,这些值不是重复的,因为它们具有不同的语义。他们的意思不同。Products.Product_name指产品的当前名称;Sales_items.Product_name是指此特定销售时的产品名称。此外,如果销售表中有FK,则当您停止销售该产品时,您无法删除该FK,或者您的销售历史记录被破坏。因此,您必须在产品中添加一个标志,说明是否应显示,这将导致其他位置的复杂性。就像所有的设计决策一样,这是一种权衡:这里重复,那里复杂。