Конференция "Базы" » Как правильно сохранить в базу массив Double?
 
  • Kolan © (29.06.08 12:34) [0]
    Здравствуйте,
     Мне нужно сохранить в базу массив чисел типа Double. Массив может содержать до
    100000х4 = 400000

    значений, но обычно это где-то 400х4=1600 чисел.

    Использую MS SQL Server 2000.

    Что для этого использовать?
     1. BLOB? Если да, то где взять примеры или книжку по работе с этим полем (я не работал с BLOB)?
     2. Может как текст его сохранять? Тогда какого типа поле использовать?
  • не магистр ни разу (29.06.08 13:54) [1]
    ну и магистры нынче пошли.
  • Loginov Dmitry © (29.06.08 14:16) [2]
    > 1. BLOB?


    Да


    > 2. Может как текст его сохранять? Тогда какого типа поле
    > использовать?


    BLOB


    > то где взять примеры или книжку по работе с этим полем


    У TField есть все необходимые методы для работы с БЛОБ-полями. Сохраняй в TMemoryStream, а из TMemoryStream'a - в свой массив. И наоборот.
  • Anatoly Podgoretsky © (29.06.08 14:24) [3]
    > Kolan  (29.06.2008 12:34:00)  [0]

    MS SQL 2000 не поддерживает таких длинных текстовых полей. Остается один из вариантов BLOB или отдельная нормальная таблица.
  • Kolan © (02.07.08 09:13) [4]
    > ну и магистры нынче пошли.

    Я же аналитик :)


    > отдельная нормальная таблица

    Хм...

    Массив — это измерение. Правильно ли я понял, что предлагается сделать таблицу:
    Код измерения   |   X   |   Y


    ?

    И насколько это правильное решение?
  • Поросенок Винни-Пух © (02.07.08 09:39) [5]
    ты где собираешься с массивом работать как с массивом?
    на клиенте?
    тогда тебе вообще не нужен массив расчесанный в таблицу. сохраняется одним блоком памяти.
  • Desdechado © (02.07.08 11:30) [6]
    Имхо, таблица должна хранится в таблице, а не поле.
    Тем более, что наверняка найдутся ее применения для расчета на сервере, а парсить блобы - занятие неблагодарное и медленное.
  • Kolan © (02.07.08 14:03) [7]
    > Имхо, таблица должна хранится в таблице, а не поле.
    > Тем более, что наверняка найдутся ее применения для расчета
    > на сервере, а парсить блобы — занятие неблагодарное и медленное.

    Мне тоже понравилось это решение, как-то сам не догадался. Всегда можно будет увидеть массив, или сохранить еще что-нить. Так и сделаю.
  • Jeer © (02.07.08 18:01) [8]
    Угу.
    И пересоздавать таблицы при изменении размерности массива непременно и обязательно.
  • Поросенок Винни-Пух © (02.07.08 18:03) [9]
    Имхо, таблица должна хранится в таблице, а не поле.

    Особенно когда она нужна вся целиком, а не отдельными фрагментами.
  • Jeer © (02.07.08 18:09) [10]
    Как вариант:

    table Area:
    id
    area_rows
    area_cols

    table AreaValues:
    area_id
    value: double
  • Desdechado © (02.07.08 18:27) [11]

    > И пересоздавать таблицы при изменении размерности массива
    > непременно и обязательно.

    Это если делать "в лоб". А если делать "с умом", то таблица будет состоять из полей вида "координата 1, координата 2, ... координата N, значение ячейки по этим координатам". Количество измерений, имхо, меняется совсем не часто. При этом пустые значения можно не хранить.

    > Особенно когда она нужна вся целиком, а не отдельными фрагментами.

    Это от задачи зависит. Но сколько видел задач, которые постулировали необходимость "только целиком", все равно находились отдельные тонкости, которым достаточно было части данных. И эти тонкости использовались чаще.
  • Anatoly Podgoretsky © (02.07.08 18:41) [12]

    > И пересоздавать таблицы при изменении размерности массива
    > непременно и обязательно.

    Откуда взялись размерности, и как с ними поможет БЛОБ поле.
  • Petr V. Abramov © (02.07.08 20:07) [13]
    > Но сколько видел задач, которые постулировали необходимость "только целиком",
    например, если массив - это картинка в каком-нить формате.
  • Desdechado © (02.07.08 20:57) [14]

    > Petr V. Abramov ©   (02.07.08 20:07) [13]

    Если уж ты картинку представляешь в виде массива, значит, тебе явно нужна обработка отдельных точек. А если она тебе не нужна, тогда зачем такой извращенный способ хранения картинок? Не проще ли простым stream?
  • Petr V. Abramov © (03.07.08 02:43) [15]

    > Если уж ты картинку представляешь в виде массива, значит,
    >  тебе явно нужна обработка отдельных точек.
    > Desdechado ©   (02.07.08 20:57) [14]

    только это не на SQL делается, и массив виде одна-запись-один-элемент бессмысленен. Если даже самые продвинутые расширения СУБД умеют делать запрос вида "все картинки, где часть тела between :value and :value",
    они это делают через спец. ф-ции работы с BLOB.
  • Anatoly Podgoretsky © (03.07.08 07:12) [16]
    > Petr V. Abramov  (03.07.2008 2:43:15)  [15]

    Зачем путать массив измерений с картинкой, как бы массив.
  • Kolan © (03.07.08 10:17) [17]
    Вариант с таблицей мне очень понравился. Получилось так:

          Charts
    PointID [int] IDENTITY (1, 1) NOT NULL
    MeasurmentID [int] NOT NULL
    ChartType [int] NULL
    X [float] NULL
    Y [float] NULL


    А на накладные расходы я плевал. :)

    Благодарю за совет — сам бы не додумался.
  • Anatoly Podgoretsky © (03.07.08 10:38) [18]
    > Kolan  (03.07.2008 10:17:17)  [17]

    Если в измерение есть разные ChartType то позволит выбирать не весь объем.
    А что такое X, Y не понятно.
  • Desdechado © (03.07.08 10:50) [19]

    > они это делают через спец. ф-ции работы с BLOB.

    Для того, чтоб такая функция сработала, нужно чтение и переваривание ВСЕГО блоба, а не 10 простых чисел по индексу. Еще не известно, что эффективнее.
 
Конференция "Базы" » Как правильно сохранить в базу массив Double?
Есть новые Нет новых   [134434   +28][b:0][p:0.001]