Spaltenanzahl in Tabellen erhöhen

Hallo!
Kann die Anzahl der Spalten einer Tabelle von 1600 erhöht werden?

Ich habe in der htup.h die Arriribute:

MaxTupleAttributeNumber und MaxHeapAttributeNumber

jeweils die erste zahle also 1664 und 1600

verändert.
Danach einfach den PGAdmin neu gestratet.
Leider ohne Erfolg!
Gibt es einen andern Trick? Wenn welcher?

Horst

Jein. Wozu sollte das gut sein? Das schmeckt nach FAIL DESIGN.

Ich habe in der htup.h die Arriribute:

MaxTupleAttributeNumber und MaxHeapAttributeNumber

jeweils die erste zahle also 1664 und 1600

verändert.
Danach einfach den PGAdmin neu gestratet.
Leider ohne Erfolg!
Gibt es einen andern Trick? Wenn welcher?

Horst

Ach herrje, das ist (vermutlich) eine Headerdatei für PostgreSQL. Wenn Du das was änderst, mußt Du PG neu compilieren. Dein PGAdmin hat damit exakt überhaupt nix zu tun, das neu zu starten hat in etwa denselben Effekt auf Dein Problem wie einen Hydranten grün anzumalen in der Hoffung, das Wetter würde so besser werden.

Nochmals: Tabellen mit mehr als, grobe Richtlinie, 100 Spalten zeugen fast immer von einem absolut falschen Design. Und da ist 100 schon sehr hoch gegriffen. Wozu genau brauchst Du das?

Ich weiß, es riecht auch genauso. ich brauche die Erweiterung auch nur für eine Tabelle.
Auswertung:
Spalten Anzahl == Anzahl der Produkte >= 9000
Zeilen == Anzahl der Bestellungen > 80000

Welche Vorgehensweise wäre denn richtiger?
Würde das denn funktionieren?
Wie compiliere ich sonst denn meine PG neu?

Horst

Welche Vorgehensweise wäre denn richtiger?

Eigene Tabelle für die Produkte (da hast hast du dann mehr als 9.000 Zeilen drinnen) und dahin referenzieren…

So ist es Mist. Sorry. Das kann kein Mensch warten…

Um die Anzahl der Tabellenspalten zu erhöhen!

Diese Tabelle existiert ich ja schon… über die referenziere.

Motivation:
Ich habe eine Anzahl von Produkten > 1600
und ich habe Bestellungen > 1600.

Ich möchte nun für jede Bestellung festhalten können, welche Produkte in dieser Bestellung bestellt worden sind. )
Weil eine Spalte ein Produkt repräsentieren soll würde ich die entsprechenden Spalten (0/1) (t/f) über eine Funktion füllen wollen. ( eine Matrix aus 0 und 1 oder t/f )
Am Schluss will/muss ich dann eine Datei, erzeugen. Die ich zur weiter Auswertung dann weiter geben kann.
Nun scheitere ich schon an der ersten Voraussetzung: Ich kann nicht jedem Produkt eine Spalte zuweisen.

Kann die Spaltenanzahl in PG erhöht werden? Wenn ja wie (Ausgenommen das was ich probiert habe)?
Wenn nein:
Wie bekomme ich PG unter Windows kompiliert? Oder wo finde ich eine Anleitung?

Oder gibt vielleicht eine ganz andere Möglichkeit o.b. zu erreichen?

Du scheinst noch nie wirklich Datenmodellierung gemacht zu haben. Das ist eine ganz normale n:m Beziehung über eine eigene Tabelle:

create table produkte 
(
   id integer not null primary key, 
   ... -- weitere Spalten
);
create table bestellungen
(
  id integer not null primary key,
  ... - weitere Spalten
);
create table produkt_bestellungen
(
   product_id integer not null references produkte (id),
   bestellung_id integer not null references bestellungen (id),
   anzahl integer not null, 
   primary key (product_id, bestellung_id)
);

Und schon kannst Du “unendlich” viele Produkte pro Bestellung verwalten.

ich will ja keine neue Datenmodellierung machen :astonished:

Ich drücke mich wohl nicht richtig aus. Ich versuche denn noch einmal.
Zuerst
Die Tabelle product and order (Bestellung) sowie weitere sind schon lange vorhanden.

Ich möchte jetzt in einer Function eine neue Tabelle erzeugen und in einer Schleife für jedes gefunden Produkt eine neue Spalte hinzufügen. Der Name dieser Spalte soll die id des gefunden Produktes werden.

CREATE OR REPLACE FUNCTION neuronale_netze()
  RETURNS integer AS
$BODY$ 
    DECLARE  
         
         userProduct record;
         prod_id_str TEXT;
         count Integer;
         
	 
    BEGIN 
	CREATE Table neuronale_netze();
	count := 1;
	For userProduct IN (select prod_id from product where master_prod_id is not null and prod_id is not null and prba_id = 1 order by prod_id)
	
		LOOP 
		
		IF COUNT < 1599 THEN -- Postgres not more than 1600 columns
			prod_id_str := '' || userProduct.prod_id;
			-- Alter Table neuronale_netze add column

			EXECUTE ' ALTER TABLE ' || 'neuronale_netze' || ' ADD COLUMN ' || quote_ident(prod_id_str) || ' ' || 'INTEGER';

			count := count +1;

		END IF;
		END LOOP;

		-- Last add two needed columns
		Alter Table neuronale_netze add column DHL INTEGER;
		Alter Table neuronale_netze add column GLS INTEGER;



	RETURN 0;
         
   END;  $BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

Als Zweites ich in einer anderen Fuction diese Tabelle neuronale_netze füllen:

CREATE OR REPLACE FUNCTION neuronale_netze_order()
RETURNS integer AS
$BODY$
DECLARE

userOrder record;

prodArrayStr TEXT;
amountArrayStr Text;

count Integer;
productArray INTEGER[];
amountArray INTEGER[];



BEGIN

Drop Table neuronalenetze_order if exsits;
-- All order with available products
CREATE table neuronalenetze_order AS (SELECT _order.ohed_id, _item.prod_id, _item.amount
FROM order_head _order, order_item _item
WHERE _order.purchase_date >= to_date('2013-01-01 00:00:00', 'YYYY-MM-DD hh24:mi:ss') and (_order.clie_id = ANY (ARRAY[1, 2])) AND _order.ohed_id = _item.ohed_id AND (_order.osta_id = ANY (ARRAY[60])) AND (_item.prod_id IN ( SELECT product.prod_id
FROM product
WHERE product.master_prod_id IS NOT NULL and prba_id = 1 ))
group by _order.ohed_id, _item.prod_id, _item.amount order by _item.prod_id, _order.ohed_id);


count := 1;
For userOrder IN (select * from neuronalenetze_bestellung order by ohed_id)

LOOP

count := count +1;
amountArray := (select array(select amount from neuronalenetze_order where ohed_id = userOrder.ohed_id));
productArray := (select array(select prod_id from neuronalenetze_order where ohed_id = userOrder.ohed_id));

amountArrayStr := (select array_to_string(amountArray, ','));
prodArrayStr := (select array_to_string(productArray, ','));


-- INSERT INTO neuronale_netze (column1,column2,column3,...) VALUES (value1,value2,value3,...);
EXECUTE ' INSERT INTO neuronale_netze (' || prodArrayStr || ')' || 'VALUES(' || amountArrayStr || ')';




END LOOP; -- END LOOP;



RETURN count;

END; $BODY$
LANGUAGE plpgsql VOLATILE
COST 100;

Zum Schluss will ich diese gefüllte Tabelle zur Weitergabe an ein anderes Externes Programm als Datei (txt, csv oder) exportieren.

Da PG nur bis 1600 Spalten verarbeiten kann, ich aber mehr als 1600 Produkte habe, kam meine Frage nach einer Erweiterung der Anzahl der Spalten in einer Tabelle.

Und diese denn möglich oder nicht? Und wenn ja wie kann ich das machen?
Das das alles nicht Regelkonform und so weiter ist, ist mir bekannt!
Besser beschrieben?

Die Tabelle product and order (Bestellung) sowie weitere sind schon lange vorhanden.
[…]
Zum Schluss will ich diese gefüllte Tabelle zur Weitergabe an ein anderes Externes Programm als Datei (txt, csv oder) exportieren.

Vermutlich kann man das auch direkt mit einem einzigen Statement machen. Nachdem Du die Limitierung nicht umgehen kannst (und die sich auch auf die Anzahl der Spalten in einem Select bezieht) kann man das “CSV” Ergebnis doch direkt erzeugen.

Hier mal basierend auf meinen Beispiel-Tabellen eine Abfrage, die das gewünschte Ergebnis direkt erzeugt, als SQLFidlle Demo:

Der eigentliche Trick ist, ein Kreuzprodukt aller Bestellungen und Produkte zu erzeugen, und das Ergebnis dann mit einem outer Join mit den Bestellungen bzw. Produkten (je nachdem wie das “Netz” aufgebaut sein soll) zu verbinden.

Abhängig davon ob der Join erfolgreich war oder nicht, wird eine 1 oder 0 an die Liste der Flags angehängt.

Da eine Text-Spalte bei Postgres 1GB groß werden darf, sollte das auch reichen wenn Du mal mehr als 9000 Bestellungen oder Produkte hast.

Interessanter Ansatz Danke