Files
fixin.me/DESIGN.md

1.9 KiB

DESIGN

Below is a list of design decisions. The justification is to be consulted whenever a change is considered, to avoid regressions.

Data type for DB storage of numeric values (decimal vs float)

  • among database engines supported (by Rails), SQLite offers storage of decimal data type with the lowest precision, equal to the precision of REAL type (double precision float value, IEEE 754), but in a floating point format,
    • decimal types in other database engines offer greater precision, but store data in a fixed point format,
  • biology-related values differ by several orders of magnitude; storing them in fixed point format would only make sense if required precision would be greater than that offered by floating point format,
    • even then, fixed point would mean either bigger memory requirements or worse precision for numbers close to scale limit,
      • for a fixed point format to use the same 8 bytes of storage as IEEE 754, precision would need to be limited to 18 digits (4 bytes/9 digits) and scale approximately half of that - 9,
    • double precision floating point guarantees 15 digits of precision, which is more than enough for all expected use cases,
      • single precision floating point only guarntees 6 digits of precision, which is estimated to be too low for some use cases (e.g. storing latitude/longitude with a resolution grater than 100m)
  • double precision floating point (IEEE 754) is a standard that ensures compatibility with all database engines,
    • the same data format is used internally by Ruby as a Float; it guarantees no conversions between storage and computation,
    • as a standard with hardware implementations ensures both: computing efficiency and hardware/3rd party library compatibility as opposed to Ruby custom BigDecimal type