PHP和DB设计:在多个表中存储数据并合并或复制数据

PHP和DB设计:在多个表中存储数据并合并或复制数据,php,sql,database-design,Php,Sql,Database Design,我正在构建一个应用程序,其中每个用户都有一堆项目。当用户注册时,大约150个特定于用户的项会从模板表中为每个用户添加到表中 逻辑如下:(复制) 用户注册 将150个模板项(行)从template_表复制到userItems_表 显示userItems\u表中的项目 用户可以在web UI中根据自己的意愿更改其项目(名称、价格、颜色)。还可以添加新的、删除现有的等 现在的问题是。。而不是将150行复制到用户项表中。。我可以只使用模板表,当用户访问UI中的项目时,我会执行两个select语句,然后在

我正在构建一个应用程序,其中每个用户都有一堆项目。当用户注册时,大约150个特定于用户的项会从模板表中为每个用户添加到表中

逻辑如下:(复制)
用户注册
将150个模板项(行)从template_表复制到userItems_表
显示userItems\u表中的项目

用户可以在web UI中根据自己的意愿更改其项目(名称、价格、颜色)。还可以添加新的、删除现有的等

现在的问题是。。而不是将150行复制到用户项表中。。我可以只使用模板表,当用户访问UI中的项目时,我会执行两个select语句,然后在PHP中合并这两个数组以获得用户特定的项目

逻辑如下:(叠加)
用户注册
如果用户更改了项目,请将差异存储到userItems_表中
在两个数组中选择template_table和userItems_table,用算法合并数组
显示合并数组中的项目

该应用程序预计将以每周约20个用户的速度增长。因此,一年内将有大约1000名活跃用户。每年至少等于150.000行加上一些特定于用户的更改。他们经常访问应用程序中的项目,但不会经常更改。读比远远高于写比

我的目标是为这个项目提供一个可持续的、可扩展的设计。。因为应用程序中的许多其他功能都依赖于访问用户项目列表

这样做的最佳方式是什么?有什么创意吗

谢谢

其他信息:

  • 使用的数据库是带有InnoDB的MySQL 5.1
  • 模板项在应用程序的生命周期内不会更改

假设您选择保留一个模板表,然后只将用户自定义的项目的记录放在用户表中。。。与其将模板与用户更改的项目合并,不如进行左外部联接

e、 g

NVL
是一个oracle函数,它返回第一个参数,除非它为null,否则返回第二个参数。如果您不使用oracle,您仍然可以使用
case
语句或使用数据库的某些专有功能获得相同的功能


这样一来,返回的每个记录都是用户的重写项(如果存在),否则是模板项(假设
user\u item\u表中不允许有空值
…如果允许,则需要将查询更改为不对每列执行
nvl
,而是检查
user\u item\u表中的主键是否为
null
。如果不是,则从
user\u item\u表中获取所有值g您可以选择保留一个模板表,然后只将用户自定义的项的记录放入用户表中……与其将模板与用户更改的项合并,不如进行左外部联接

e、 g

NVL
是一个oracle函数,它返回第一个参数,除非它为null,在这种情况下,它返回第二个参数。如果不使用oracle,您仍然可以使用
case
语句或使用数据库的某些专有函数来获得相同的功能


这样一来,返回的每个记录都是用户的重写项(如果存在),否则是模板项(假设
user\u item\u表中不允许有空值
…如果允许,则需要将查询更改为不对每列执行
nvl
,而是检查
user\u item\u表中的主键是否为
null
。如果不允许,则从
user\u item\u表中获取所有值
您可以创建模板集的副本,另一种方式是,您可以设置一个“覆盖”,每个人都可以共享模板,除了他们更改或添加的内容

有些讨论要考虑。

性能:在复制版本中,用户访问一个表以获取所需内容(=1个表命中)。在覆盖版本中,您始终必须访问两个表,首先获取用户输入的内容,然后获取用户未输入的内容(=2个表命中,根据@Renderlin的空值检查算法)

随时间修改模板:在T次和N次USRER之后,当您决定向模板添加某些项目时会发生什么情况。在复制版本中,现有用户不会获得新项目,而在覆盖版本中,每个用户都会立即获取该新项目。同样,如果您选择更改(或删除)模板项,如果用户从未修改过该项,则会立即为其修改该项


我没有足够的信息来判断什么是有效的,什么是无效的——这必须根据您的业务需求来确定。

一个版本,您复制模板集的副本,另一种方式,您设置一个“覆盖”,每个人都共享模板,但他们更改或添加的内容除外

有些讨论要考虑。

性能:在复制版本中,用户访问一个表以获取所需内容(=1个表命中)。在覆盖版本中,您始终必须访问两个表,首先获取用户输入的内容,然后获取用户未输入的内容(=2个表命中,根据@Renderlin的空值检查算法)

随时间修改模板:在T次和N次USRER之后,当您决定向模板添加某些项目时会发生什么情况。在复制版本中,现有用户不会获得新项目,而在覆盖版本中,每个用户都会立即获取该新项目。同样,如果您选择更改(或删除)模板项,如果用户从未修改过该项,则会立即为其修改该项

我没有足够的信息告诉菲古
select nvl(uit.item_id, itt.item_id) item_id, nvl(uit.name, itt.name) name, nvl(uit.price, itt.price) price
from item_template_table itt
left outer join user_item_table uit
  on itt.item_id = uit.item_id