首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >频繁选择和插入的数据库设计

频繁选择和插入的数据库设计
EN

Stack Overflow用户
提问于 2014-03-10 05:36:43
回答 5查看 789关注 0票数 0

我想知道以下情况下最好的数据库设计。

我使用SpringSql Server,我的情况可以简化如下:

假设这里有三张桌子:

项目:

  • id(唯一,主键,自动增加)
  • 名字
  • 类别

地址:

  • id(唯一,主键,自动增加)
  • 地址
  • 邮编

顺序:

  • id(唯一,主键,自动增加)
  • 价格
  • 日期
  • itemId(外键)
  • addressId(外键)

业务逻辑是Spring处理包括项目、地址和订单信息在内的传入消息。

如果传入项数据存在于数据库中(exist表示名称和类别相同),则返回该记录的id。它不存在,插入新记录并返回新id。

地址差不多。如果传入的地址数据存在于数据库中(exist表示地址和邮政编码是相同的),则返回该记录的id。它不存在,插入新记录并返回新id。

然后插入带有前面项id的order表,并将address id作为外键。

我现在所做的就是将所有这些选择和插入逻辑放在一个存储过程中,以减少服务器和数据库之间通信的延迟。

我想知道这个案子有没有更好的解决办法。

更新:

下面是我使用的Proc

代码语言:javascript
运行
复制
CREATE procedere spInsert

--list of parameters

set @tmpItemId = (select id from item where name=@name and category=@category)

if @tmpItemId is NULL

   begin 
       insert to item values(@name,@category)
       set @tmpItemId=@@IDENTITY
   end

--the same logic applied to Address

insert into order values(@price,@date,@tmpItemId,@tmpAddressId)

经过一段时间的测试,速度不令人满意,插入100条记录大约需要10-20秒。

我可以问一下改进的方法吗?

顺便说一句,我认为存储过程的瓶颈在于每次选择id并频繁插入。如何使用uuid作为表的索引,而不是在数据库中自动增加索引?这样,Java端就可以处理选择部分,因为Java端提供了uuid,而sql server只关心insert

这是个不错的选择吗?

EN

Stack Overflow用户

发布于 2014-03-22 14:22:23

在选择设计时有几个因素要考虑。下面是几个开始的例子:

  1. 数据集有多大?如果数据集很小,那么您的解决方案就能工作。随着行数的增加,文本搜索可能会减慢。庞大得惊人的数据库可能无法使用id的自动增加值。
  2. 是否有更多的业务规则需要处理?例如,如果找不到确切的匹配,程序会返回关闭匹配吗?如何实现业务规则的逻辑和错误处理可能会产生影响。如果在验证好的条目、地址或订单方面有很多规则,最好将代码分离到不同的存储过程中,以便更容易地调试和隔离代码更改的连锁反应。未来似乎总是带来不断变化的商业环境。
  3. 为了提高表的可读性,在Item名称中,键itemId,在Address表名称中,键addressId。尝试消除假设,因为没有两个人有完全相同的经历,并且可能从名字中得出不同的初步结论。
  4. 实际的业务规则和插入代码可以进入表上的触发器。然后存储过程将插入到项中,在成功时插入到地址中,在成功时插入到顺序中。这将使单个执行计划更简单,这将使优化更容易理解。再一次,业务规则被分割开来,减少了范围维护和测试。
票数 0
EN
查看全部 5 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22292765

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档