如何实现参考数据Java / DB

时间:2011-02-23 19:31:06

标签: java database-design

我有一个表格,其中包含一些我需要合并到Java程序中的因素。起初我正在考虑对数字进行硬编码,但尝试创建适合这些因素的数据结构似乎很痛苦。所以我想问一下,看看在数据库,平面文件或java中实现它作为参考数据是否更好。该数字将每六个月更改一次,并将用于数学计算。

思想?

Factor List

4 个答案:

答案 0 :(得分:3)

对于像这样的缓慢变化的数据,我会使用外部配置文件。根据您的数据结构,似乎CSV可以正常运行,并且业务用户可以轻松地使用Excel进行编辑。

如果它会更频繁地更改,您需要以编程方式生成数据,或者您想提供用于编辑数据的UI,您可以将其移动到数据库。

答案 1 :(得分:1)

您可以将其表示为XML,但对于此类数字数据可能有点重。但XML将允许您进行相当描述性和自我记录。然后,您可以轻松地将其解析为Java(或您选择的其他语言)。

部分XML示例:

<dataset>
  <gd>
    <16to21>
      <single>
        <male>1.10</male>
        <female>1.20</female>
      </single>
      <married>
        <male>0.90</male>
        <female>0.80</female>
      </married>
    </16to21>
    ...
  </gd>
  <ngd>
    ...
  </ngd>

答案 2 :(得分:1)

无论您如何存储数据,都必须创建一个包含数据的数据结构。但是这种数据的数据结构不一定非常复杂。它只是一个包含属性的值列表。您不必将它们存储在类似于表的复杂结构中。

将数据表示为单个列表时,从平面文本文件加载数据也非常容易。

public class DataTable {

    private List<Entry> table = new ArrayList<Entry>();

    public double getValue(Sex sex, MaritalStatus maritalStatus, AgeInterval ageInterval, Type type) {
        for (Entry entry : table) {
            if (entry.sex == sex && entry.maritalStatus == maritalStatus && entry.ageInterval == ageInterval && entry.type == type) {
                return entry.value;
            }
        }
        throw new IllegalArgumentException("Unknown value");
    }

    public void load(String filename) {
        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(filename)));
            String line;
            while ((line = reader.readLine()) != null) {
                StringTokenizer t = new StringTokenizer(line, ":");
                table.add(new Entry(
                        Sex.valueOf(t.nextToken()),
                        MaritalStatus.valueOf(t.nextToken()),
                        AgeInterval.valueOf(t.nextToken()),
                        Type.valueOf(t.nextToken()),
                        Double.valueOf(t.nextToken())));
            }
        } catch (IOException e) {
            throw new IllegalStateException("Failed to read the data file", e);
        }
    }

}

enum Sex {M, F}
enum MaritalStatus {SINGLE, MARRIED}
enum AgeInterval {I16_21, I22_35, I35_55, I55}
enum Type {GD, NGD} // Whatever this is ...

class Entry {
    Sex sex;
    MaritalStatus maritalStatus;
    AgeInterval ageInterval;
    Type type;
    double value;

    Entry(Sex sex, MaritalStatus maritalStatus, AgeInterval ageInterval, Type type, double value) {
        this.sex = sex;
        this.maritalStatus = maritalStatus;
        this.ageInterval = ageInterval;
        this.type = type;
        this.value = value;
    }
}

数据文件如下所示:

M:SINGLE:I16_21:GD:1.10
F:SINGLE:I16_21:GD:1.20
...

答案 3 :(得分:0)

您可以分解字段的一种方法是性别,年龄,marital_status,GD_VS_NGD,表格中的数据以及您使用此数据的时间段的某些标识符,除非您不需要保留记录数据。