myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Datentechnologien » Im SQLite automatisch Spalten erstellen lassen
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Im SQLite automatisch Spalten erstellen lassen

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Kriz
myCSharp.de-Mitglied

Dabei seit: 17.01.2017
Beiträge: 60


Kriz ist offline

Im SQLite automatisch Spalten erstellen lassen

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

verwendetes Datenbanksystem: SQLITE

Guten Morgen Freunde der Sonne,
Ich braucht eine Tabelle mir 365 Spalten. Durchnummeriert von 1 - 366. Gibt es bei sqlite von Haus aus eine Möglichkeit Spalten automatisch erzeugen zu lassen, oder muss ich das über eine for Schleife in C# machen?

Vielen Dank im voraus!
kriz
15.07.2019 05:28 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
chilic
myCSharp.de-Poweruser/ Experte

Dabei seit: 12.02.2010
Beiträge: 2.004


chilic ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ich würde das über eine Schleife machen.

Vorher würde ich darüber nachdenken ob du das wirklich brauchst. So ein Ansatz deutet auf einen Fehler bei den Überlegungen hin. Eine zweite Tabelle die auf die erste verweist und die die 365 Spalten jeweils als eigene Zeile speichert, könnte deine Anforderung sauberer lösen.
15.07.2019 06:08 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Kriz
myCSharp.de-Mitglied

Dabei seit: 17.01.2017
Beiträge: 60

Themenstarter Thema begonnen von Kriz

Kriz ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Was wäre denn der Vorteil der zweiten Variante?
In der aktuellen Situation kann ich mit meinem Reader direkt auf die passende Spalte zugreifen.
In deinem Vorschlag müsste ich ja dann die komplette Zeile einlesen, splitten, um dann auf den passenden Eintrag/Spalte zugreifen zu können.
Wäre das schneller bzw speichersparsamer?
15.07.2019 09:46 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 12.902
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Naja, sein Vorschlag basiert einfach auf den Grundlagen von SQL Design.
 Normalisierung (Datenbank)
15.07.2019 10:16 Beiträge des Benutzers | zu Buddylist hinzufügen
T-Virus T-Virus ist männlich
myCSharp.de-Mitglied

Dabei seit: 17.04.2008
Beiträge: 1.269
Entwicklungsumgebung: Visual Studio, Codeblocks, Edi
Herkunft: Nordhausen, Nörten-Hardenberg


T-Virus ist offline Füge T-Virus Deiner Kontaktliste hinzu

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

@Kriz
Du bräuchtest im Endeffekt nur eine Tabelle mit der Information aus welcher Zeile und Spalte der Eintrag kommt.
Um die Performance kannst du dich dann per Index kümmern.
Oder falls möglich kannst du direkt einen zusammengesetzen PK aus Zeile und Spalte bilden, was dann den Index über den PK liefert und auch sicherstellt, dass es keine Dubletten in der Tabelle geben kann.
Hängt aber von dem Anwendungsfall bei dir ab.
Mehr Details zu dem Zweck des Ganzen wären hilfreicher um dir eine mögliche Lösung zuempfehlen.

T-Virus
15.07.2019 10:40 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Kriz
myCSharp.de-Mitglied

Dabei seit: 17.01.2017
Beiträge: 60

Themenstarter Thema begonnen von Kriz

Kriz ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Die Situation ist folgende:

Es wird ein Dienstplan für ein Restaurant geschrieben. Dieses Restaurant hat jeden Tag im Jahr geöffnet (jaja, die armen Gastronomen!), daher die 365 Spalten. Nun bekommt jeder Mitarbeiter eine eigene Zeile, mit den IDs für die Schichten je Tag. Die Schichten sind dann in einer separaten Tabelle wo auch die Pausen und sonstige weitere Informationen abgelegt sind.
Nun arbeitet natürlich niemand 365 Tage durch, somit wird die ein oder andere Spalte bei den Mitarbeitern leer sein.
Aktuell habe ich es so gelöst, dass ich die Dienstpläne wochenweise speicher.
Dafür habe ich folgende Tabellen:
1. Tabelle mit Informationen zum Dienstplan (Dienstplan ID, Startdatum, Notizen, usw)

2. Tabelle die einer Dienstplan ID die passenden Mitarbeiter mit den Verweisen zu den gearbeiteten Schichten verknüpft. Pro Dienstplan ID gibt es mehrere Zeilen, pro Mitarbeiter eine. Das angefügte Bild veranschaulicht es vllt etwas. (DiID = Dienstplan ID, MiID = Mitarbeiter ID, und unter den Tagen sind die jeweiligen IDs für die gearbeiteten Schichten)

3. Tabelle für die gearbeiteten Schichten inkl Pausenzeiten usw.

Das wirkt für mich langsam alles wie eine "Flickschusterei" und etwas umständlich, besonders wenn ich Auswertungen vornehmen möchte wann wer wie gearbeitet hat, wieviel Mitarbeiter durchschnittlich zu einem einem bestimmten Zeitpunkt da sind und so weiter.
Daher dachte ich mir, dass ich einfach eine Jahrestabelle erstelle...

Kriz hat dieses Bild (verkleinerte Version) angehängt:
Beispiel.png
Volle Bildgröße

16.07.2019 05:00 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
thomas.at thomas.at ist männlich
myCSharp.de-Mitglied

Dabei seit: 19.09.2005
Beiträge: 98
Entwicklungsumgebung: Visual Studio 2017
Herkunft: Österreich / Wien


thomas.at ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo

Für dein Problem brauchst Du doch nur eine Tabelle mit 4 Spalten:


DiID | MiID | Datum | Schicht



Damit kannst Du alle Tage die ein Mitarbeiter arbeiten soll eintragen und entsprechend auch suchen.

Thomas

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von thomas.at am 16.07.2019 06:42.

16.07.2019 06:41 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Kriz
myCSharp.de-Mitglied

Dabei seit: 17.01.2017
Beiträge: 60

Themenstarter Thema begonnen von Kriz

Kriz ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Die Idee hatte ich auch, aber wie sieht es da mit der Performance aus? Nehmen wir mal an, wir haben 100 Mitarbeiter die alle eine fünf Tage Woche haben und keinen Urlaub machen, dann haben wir 26.000 Einträge. Ist das eine normale Größenordnung, oder werden Abfragen da länger dauern? Mein Kenntnisstand bei Datenbanken ist eher rudimentär...
16.07.2019 07:54 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Stefan.Haegele Stefan.Haegele ist männlich
myCSharp.de-Mitglied

avatar-3068.jpg


Dabei seit: 13.03.2009
Beiträge: 352
Entwicklungsumgebung: Visual Studio 2010 Ultimat
Herkunft: Untermeitingen


Stefan.Haegele ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von Kriz:
Nehmen wir mal an, wir haben 100 Mitarbeiter die alle eine fünf Tage Woche haben und keinen Urlaub machen, dann haben wir 26.000 Einträge. Ist das eine normale Größenordnung, oder werden Abfragen da länger dauern? Mein Kenntnisstand bei Datenbanken ist eher rudimentär...

Ist die Frage jetzt dein Ernst? Mit 26.000 Einträgen langweilt sich der SQL Server - Wir haben Tabellen mit mehr als 10 Millionen Einträgen.

TIPP: Grundlagen des SQL Servers helfen auch in der Entwicklung von Anwendungen auf Datenbasis SQL
16.07.2019 08:36 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
WarLorD_XaN WarLorD_XaN ist männlich
myCSharp.de-Mitglied

Dabei seit: 25.10.2006
Beiträge: 92
Entwicklungsumgebung: Visual Studio
Herkunft: Austria


WarLorD_XaN ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von Stefan.Haegele:
Mit 26.000 Einträgen langweilt sich der SQL Server

Es geht hier zwar um SQLite, aber auch die SQLite Engine kommt problemlos mit 26.000 Zeilen klar.

Im Gegensatz dazu könnte es bei sehr vielen Spalten schon eher mal zu Problemen kommen.

Außerdem:

Zitat von Donald Knuth:
Premature Optimization Is the Root of All Evil
16.07.2019 10:32 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
T-Virus T-Virus ist männlich
myCSharp.de-Mitglied

Dabei seit: 17.04.2008
Beiträge: 1.269
Entwicklungsumgebung: Visual Studio, Codeblocks, Edi
Herkunft: Nordhausen, Nörten-Hardenberg


T-Virus ist offline Füge T-Virus Deiner Kontaktliste hinzu

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

@Kriz
Du solltest dir das Thema Datenbanken sowie Indizierung mal genauer anschauen.
Auch für Sqlite gelten die gleichen Grundlagen.
Die Performance von Datenbanken wie SQL Server, PostgreSQL und Sqlite sind schon extrem hoch.
Mit der richtigen Hardware Kosntellation und auch normalisierter und optimierter Datenbank kannst du auch mit zig Millionen Einträgen ohne Probleme arbeiten.

Kleine Tabellen haben sogar noch den Vorteil, dass diese vollständig in den RAM passen können und somit eine noch höhere Performance beim Lesen erhalten können.
Also mach dir bei der Tabelle keinen Kopf über die Performance.

T-Virus
16.07.2019 10:33 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Kriz
myCSharp.de-Mitglied

Dabei seit: 17.01.2017
Beiträge: 60

Themenstarter Thema begonnen von Kriz

Kriz ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Alles klar, dann werde ich den Ansatz von Thomas.at verfolgen.
Vielen Dank für Eure Hilfe!!
16.07.2019 11:34 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Stefan.Haegele Stefan.Haegele ist männlich
myCSharp.de-Mitglied

avatar-3068.jpg


Dabei seit: 13.03.2009
Beiträge: 352
Entwicklungsumgebung: Visual Studio 2010 Ultimat
Herkunft: Untermeitingen


Stefan.Haegele ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Noch eine kleine Anmerkung zu der - nun auch von dir - bezorzugten Lösung:

Hättets du deinen Plan umgesetzt, hätte dein SQL Befehl wahrscheinlich so in der Art ausgeschaut:

C#-Code:
SELECT * FROM Dienstplan

da du unmöglich alle 365 Spalten in deinen SQL Befehl aufnehmne kannst. Soltest du jetzt auch nur eine Spalte in der Datenbank verschieben hast du ein gewaltiges Problem, da dein Ergebnis nun eine andere Form hat. Mit der jetzigen, neuen Lösung kannst du folgenden SQl Befehl ausführen

C#-Code:
SELECT dp.DiID,
       dpd.MiID,
       dpd.Datum,
       dpd.Schicht

FROM Dienstplan AS dp

INNER JOIN Dienstplan_Detail AS dpd ON dpd.ID = dp.DID

Vorteil: Deine Spalten sind immer gleich - egal wie Sie auf den SQL Server liegen. Noch dazu ist der Befehl SELECT * ein absolutes NoGo!

Achtung: Der SQL Befehl ist nur als Beispiel zu sehen
16.07.2019 14:10 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als ein Monat.
Der letzte Beitrag ist älter als ein Monat.
Antwort erstellen


© Copyright 2003-2019 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 19.08.2019 16:50