我写了一个小型应用程序来处理私人股票市场。我将所有数据存储在一个表中(以简化问题),并使用以下列:
ID,交易类型,数量,号码,号码,客户ID,日期
1,Buy,100,AB1000,AB1099,5,2009-01-30
2,Sell,100,AB1000,AB1099,5,2001-01-01
3,购买,40,AB500,AB539,5,2010-01-01
对每个人来说都是如此。当我的用户想要获取客户所拥有的信息时,他会在Buy
和Sell
上进行总结,确保数字匹配(在公开市场上没有股票编号,在私人网站上)有)。到目前为止,我的程序中无法部分销售任何东西。例如,如果我之前没有买过它,我不能卖出30只股票。因此,即使您的客户可能拥有40只股票,但由于数字不匹配,我只能卖出40只而不是30只。
我今天被问到是否可以改变它(他们改变了原来的要求),我想得到一些建议,如果它真的是正确的方法:
如果客户有100只股票然后试图只卖出30只数字AB1030 - AB1059我会在我的表格中插入这样的东西:
ID,TransactionType,数量,来自的号码,号码,客户ID
4,Split-,100,AB1000,AB1099,5 5,Split +,30,AB1000,AB1029,5 6,Split +,30,AB1030,AB1059,5 7,Split +,40,AB1060,AB1099,5 8,卖出,30,AB1030,AB1059,5
我甚至无法向用户展示此分裂,以免过多地混淆他/她。作为一个补充,我不保留实时数据,我只保留历史记录,如果我想获得current information
,我总是要重新计算所有内容。我是这样实现的,因为他们经常使用旧数据来检查旧日期等客户的当前状态。
你的建议是什么?这种方法是好的还是我应该完全改写它。请记住,系统已经存在,所以我不得不以某种方式迁移它。而且它不应该是一个完整的返工,因为我不会得到它最有可能的报酬,所以没有6个月的时间来解决它。
答案 0 :(得分:1)
我们能否在您的业务逻辑中看到一些代码,以及您对买卖股票的限制? 我猜你不得不重新考虑在卖出不同金额时向你的客户说停止的方式。如果您的企业需要限制销售您尚未购买的商品,那么您可能还不能将其卖掉(还)?或者只有在适用特定规则时才能出售。
答案 1 :(得分:1)
在我看来,你应该用更灵活的东西来分解当前的验证逻辑。也就是说,不是要求数字匹配,而是可能只需要余额为0或正数(即所以你不能卖掉你不拥有的数字)。为了实现这一点,我将重构您的数据存储,以便您可以将拥有的金额检查为单个值,而不是将其与过去的事务进行匹配。
这可以通过以下几行中的单个查询轻松实现:
public void SellStock( int clientID, string stockSymbol, int quantityToSell )
{
using( var scope = new TransactionScope() )
{
// pseudo-sql for reducing client portfolio by quantity
update ClientStockPortfolio
set Quantity = Quantity - quantityToSell
where ID = clientID
and StockSymbol = stockSymbol
and Quantity >= quantityToSell
// log transaction history and update other tables as needed
}
}