首页 > 解决方案 > 如何遍历数据库中已经存在的对象并更新字段?

问题描述

我正在构建一个 RESTful API,它将显示我所有的资产/投资。我想在每项资产中显示该资产占投资组合总价值的百分比。我希望 totalValue 是动态的,因此创建的每个新资产都会将(realTimePrice * 金额)加到 totalValue 中。

我的问题是:一旦我完成填充数据库并计算了 totalValue,我如何在数据库中的每个对象上运行并运行 setPercentage() ?

例如:

“名称”:比特币“代码”:BTC-USD “百分比”:20

如何将 totalValue 与插入数据库的每个对象相加

在此处输入图像描述

这就是我播种数据库的方式:

package assets.asset;
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


@Configuration

class SeedDB {

@Bean
CommandLineRunner initDatabase(DataBase repository) {
    return args -> {

        repository.save(new Asset("", "",, , "Crypto"));
        repository.save(new Asset("", "",, , "Crypto"));
        repository.save(new Asset("", "",, , "Crypto"));
        repository.save(new Asset("", "",, , "Stock"));
        repository.save(new Asset("", "",, , "Stock"));
        repository.save(new Asset("", "",, , "Stock"));
        
    };
}

}

标签: databaserestwebapi

解决方案


这根本不是一个可扩展的设计。一个计算被多次完成。想象一下,您有一个包含 100 万个这些值的表格,并且您需要填写所有这些值的投资组合百分比,您实际上将重新计算总资产价值一百万次。这个值可以在添加新字段时被缓存和更新。

在我看来,资产价值相对于投资组合的百分比,甚至不应该存储在数据库中。原因是,这个值需要经常更新。例如,每次我们添加一项资产时,我们都必须更新所有值的百分比。

这是应根据要求计算的值。

我们可以在数据库中存储一个名为“总资产价值”的特定值。这将保存相关信息。然后每次执行操作以添加新号码时,我们都可以拥有一个可以执行此操作的服务

public void setTotalValue() {
    TotalValue+=BigDecimal.valueOf(amount);
    repository.save(totalValue); // this line can be however you want to persist your data
}

这个想法是每次添加新资产时都增加总价值,然后当我们想要计算总价值时,我们可以做类似的事情,

public Map<Asset, BigDecimal> getTotalPercentages(List<Asset> assets) {
    for (asset : asset) {
        map.put(asset, asset.value/totalValue);
    }
    return map;
}

这将为您动态提供准确的数据,并节省插入数据库的额外时间。

编辑:在评论中给出了一些上下文之后,我重新做了另一个解决方案。

我们可以简单地拥有一个变量 totalValue ,每次您在播种阶段添加资产时都会增长,并且在播种结束时,您可以遍历所有资产并为每个资产设置百分比。

int totalValue = 0;
String[] types = new String[]{"Crypto", "Stock"};
for (int i = 0; i < NUM_OF_DESIRED_ASSETS; i++) {
    Random r = new Random();
    int value = r.nextInt(10);
    int index = r.nextInt(2);
    repository.save(new Asset("", "",value, , types[index]));   

    totalValue+=value; 
}

for (asset : assets) {
    asset.setPercentage(asset.value/totalValue);
    repository.save(asset);
}


推荐阅读