Как поместить несколько значений в одну переменную или поле без использования списка и последующего синтаксического анализа?

Иногда необходимо иметь несколько значений в одной переменной или поле базы данных, даже если это нарушает принципы реляционной нормализации. В python и других языках, поддерживающих списки, это легко. В других нет. См. раздел вставка нескольких значений в один атрибут.

Одним из распространенных методов является объединение значений в строку с разделителями-запятыми: «1,2,3» или «английский, французский, испанский», а затем извлечение значений путем анализа.

Когда допустимые значения поступают из перечисляемого списка, есть ли другой способ, не требующий синтаксического анализа?


person user15972    schedule 05.03.2013    source источник


Ответы (2)


да. Используйте простые числа, перемножьте их вместе, а затем разложите на множители.

  1. Используемый тип поля: целое или большое целое

  2. Use code values that are prime numbers
    • 3 == English
    • 5 == французский
    • 7 == испанский
    • 11 == итальянский

  3. Store the product of all that apply into the field.
    • 21 == English and Spanish
    • 385 == французский, испанский и итальянский

  4. Используйте функции по модулю, чтобы определить, какие значения находятся в поле

    if ( field % 3 == 0 ) {  english() ;}
    if ! (field % 5) { french() ;}
    =IF(NOT(MOD(A203,5)),"French","")
    


  5. The same value can appear multiple times
    • 9 == English, English

Впервые я использовал эту технику для хранения размеров.

  • 3 == время
  • 5 == длина
  • 7 == масса
  • 11 == заряд
  • 13 == температура
  • 17 == родинки

Например, плечо рычага «первого момента» будет иметь размерное значение 35 == масса * длина. Чтобы сохранить дробные измерения в целом, я умножал дробные измерения на произведение всех из них и обрабатывал их при обработке.

  • 255255 == 3*5*7*11*13*17
  • сила == масса * длина / (секунда ^ 2)
  • сила == (7 * 5 / (3 * 3)) * 255255 * 255255
  • сила == 253381002875

Причина, по которой я использовал целые числа, заключалась в том, чтобы избежать недопустимых сравнений на равенство из-за ошибок округления.

Пожалуйста, не запрашивайте код для извлечения дробных размеров. Все это было 40 лет назад в APL/360.

person user15972    schedule 05.03.2013

Если вам не нужно допускать кратность одного и того же значения, вы можете использовать битовую карту. В зависимости от того, разрешено ли до 8, 16, 32, 64 или 128 значений, они могут поместиться в 1, 2, 4, 8 или 16-байтовое целое число.

person user15972    schedule 05.03.2013