Format przechowywania danych

0

Witam,

jestem na etapie projektowania tabeli w bazie danych. Tabela ma przechowywać dane z Excela. Istotne jest to, że w Excelu może byc kilka zakładek, w każdej zakładce użytkownik wypełnia tabelkę o różnej ilości kolumn i wierszy (np. ilość tą definiuje poprzez podanie dwóch liczb: il. wierszy, il. kolumn).

Nie wiem zabrać się za przechowywanie danych.

  1. Pierwszy pomysł, to zrobienie tabeli SQL z np. 100 polami zakładając, że maksymalnie 100 kolumn w excelu będzie mogło byc wypełnione. Do tego np. jedno pole na nazwę zakładki, jedno na numer wiersza, i jedno na kolejność wiersza w danej zakładce excel.

  2. Drugi pomysł, to zrobienie jednej tabeli, gdzie będa przechowywane parametry tabel, a drugiej w ktorej będą fizycznie te dane. W tej drugiej tabeli rozwazam jako minimum takei pola: id, nazwa zakladki, numer wiersza, numer kolumny, wartosc, kolor tła, kolor tekstu.

Który pomysł wg Was jest bardziej rozsądny. Wydaje się, że drugi jest bardziej dynamiczny i nie ograniczony z góry nadanymi makymalnymi zakresami. Być może jest za to trudniejszy w obsłudze.

Będę wdzięczny za inne pomysły.

0

Druga wersja zdecydowanie. Jeżeli rozmiar jest zmienny w czasie działania systemu to moim zdaniem powienienes dane przechowywać w dwóch tabelach:

CREATE TABLE ARKUSZE
(id AUTO_INCREMENT PRIMARY KEY,
nazwa varchar (256)
) 

CREATE TABLE DANE
(id AUTO_INCREMENT PRIMARY KEY,
kolumna INTEGER,
wiersz INTEGER,
wartosc VARCHAR(512),
typ INTEGER,
FOREIGN KEY(idArkusza) references ARKUSZE(id)
) 
0

Dziękuję.

0

A czemu nie korzystać z ALTER TABLE i dodawać lub odejmować tym kolumny?

0
rasert napisał(a)

A czemu nie korzystać z ALTER TABLE i dodawać lub odejmować tym kolumny?

Ponieważ:
-zwykły użytkownik nie powinien mieć uprawnień do wykonywania zapytań DDL.
-jak sobie wyobrażasz odjęcie kolumny? np pierwszy wpis ma milion kolumn a drugi 1. Nie możesz przecież skasować tych milion -1 kolumn, a tabela nie może mieć różnej liczby kolumn dla każdego rekordu.
-jeden rekord z milionem kolumn spowoduje, że tabela będzie dużo większa, nawet jeśli pozostałe rekordy będą miały po 10 kolumn.
-jeżeli jeden arkusz będzie zawierał kolumny "imie, nazwisko" a drugi "miasto, kod pocztowy" to w sumie musisz powiększyć tabele do 4 kolumn, bo nie wrzucisz sensownie tych danych do tabeli 2 kolumnowej

Ale imho autor tematu powinien się zastanowić, czy nie lepiej podzielić te arkusze na kilka typów i stworzyć kilka tabel. Takie przechowywanie nieustrukturyzowanych danych w bazie danych chyba nie ma większego sensu. Chyba, że się mylę ;)

0

Procedura zaczytywania danych do i z Excela w drugim przypadku jest wręcz trywialna. Drugi ze sposobów pozwala tez łatwo przechowywać wyrażenia i dodatkowe właściwości każdej komórki.

0

Drugie rozwiązanie jest jak najbardziej zasadne, gdyż:

  • nie wiadomo jeszcze ile będzie tabel
  • jakiego typu mogą pojawić się dane (liczby, tekst, data), więc załatwię to polem z typem danych (czyli tak naprawdę przechowywanie w postaci tekstu i zamienianie w locie na odpowiedni format danych; lub byc moze zrobię dwa pola: tekst i liczba dla każdej komórki w zalezności od tego jaka będzie potrzeba;
  • jedno lub dwa pola będzie przechowywać właściwości komórki;

Nie wiem jeszcze jak załatwić sytuację, gdy w tabeli excel ktoś usuwa wiersz/kolumnę.
Rozważam kasowanie całej zawaretości danej tabeli xls w SQLu, a nastepnie wrzucenie jej na nowo do sqla, tak by pominac zabawę w podmianę numerów wierszy i kolumn.
Nie przewiduję dużej ilośc danych (max 50 tabelkek xls o rozmiarze 30x30).

Mam jeszcze jeden problem, ale to już chyba raczej excelowy, tzn.

  • jak sprawdzić w jakim zakresie użytkownik wpisał dane, to znaczy, ktore komórki wypełnił. Czy mam przechodzić cała zakładkę excela (co oznacza przejście przez kilkaset tysięcy komórek w pętli celem sprawdzenia czy coś tam nie jest wpisane?)
  • nie wiem jeszcze jak ominąc problem scalonych komórek (być może zablokuję tą możliwość z poziomu excela i po kłopocie:)
0
void-tec napisał(a)
rasert napisał(a)

A czemu nie korzystać z ALTER TABLE i dodawać lub odejmować tym kolumny?

Ponieważ:
-zwykły użytkownik nie powinien mieć uprawnień do wykonywania zapytań DDL.
-jak sobie wyobrażasz odjęcie kolumny? np pierwszy wpis ma milion kolumn a drugi 1. Nie możesz przecież skasować tych milion -1 kolumn, a tabela nie może mieć różnej liczby kolumn dla każdego rekordu.

Czyli zamienia kolumny na symulowane kolumny w postaci wierszy, ale te wiersze muszą przechowywać wartości tego samego typu. Jeśli zaś dodawane kolumny mają mieć różny typ danych, to nie zadziała.

0

@rasert - zrobisz tabelę z milionem kolumn?

0
Kermitek1979 napisał(a)

Mam jeszcze jeden problem, ale to już chyba raczej excelowy, tzn.

  • jak sprawdzić w jakim zakresie użytkownik wpisał dane, to znaczy, ktore komórki wypełnił. Czy mam przechodzić cała zakładkę excela (co oznacza przejście przez kilkaset tysięcy komórek w pętli celem sprawdzenia czy coś tam nie jest wpisane?)
  • nie wiem jeszcze jak ominąc problem scalonych komórek (być może zablokuję tą możliwość z poziomu excela i po kłopocie:)
var
   ExcelApp:OleVariant;
   tmpRow, tmp: integer;
const
  xlUp = 3;
begin
  try
    ExcelApp:=GetActiveOleObject('Excel.Application');
  except
   
  end;
  ExcelApp.Workbooks.Open(file_path);


  tmpRow:= 0;
  
  tmp:= ExcelApp.Range['A' + IntToStr(65536)].end[xlUp].Rows.Row;
  if (tmp > tmpRow) then tmpRow:= tmp;
  tmp:= ExcelApp.Range['B' + IntToStr(65536)].end[xlUp].Rows.Row;
  if (tmp > tmpRow) then tmpRow:= tmp;
  tmp:= ExcelApp.Range['C' + IntToStr(65536)].end[xlUp].Rows.Row;
  if (tmp > tmpRow) then tmpRow:= tmp;

W tmpRow będziemy mieć największą liczbę wypełnionych wierszy spośród kolumn A,B,C
(Oczywiście powyższy przykład lepiej zamknąć w pętli)

1 użytkowników online, w tym zalogowanych: 0, gości: 1