Re: bitstring ya da numerik tur uzerinde "bit count" alabilmek

From: Volkan YAZICI <yazicivo(at)ttnet(dot)net(dot)tr>
To: Kerem Hadimli <wastiee(at)gmail(dot)com>
Cc: pgsql-tr-genel(at)postgresql(dot)org
Subject: Re: bitstring ya da numerik tur uzerinde "bit count" alabilmek
Date: 2006-12-04 15:03:20
Message-ID: 20061204150319.GB1356@alamut
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-tr-genel

On Dec 04 04:27, Kerem Hadimli wrote:
> Gelistirmekte oldugum yazilimda, iki verinin belli 'flag'lere gore
> uyumuna yonelik siralama yapmak istiyorum.
> Flag dedigim sey boolean ve sayica 200-300 u bulabiliyor.
>
> Yapmak istedigim sey, elimdeki bir tane veriye (300 tane flag iceren)
> en uygun verileri siralatmak, sadece TRUE olanlar yonunden.
>
> Test asamasi icin, konseptin kalaninin netlesmesi icin, 300 tane
> boolean kolon kullanip,

Aman deyim! Bir tabloda 300 sütununuz varsa ya çok ama çok uç bir
durumla uğraşıyorsunuz, ya da kesinlikle bir şeyleri yanlış
yapıyorsunuz.

> select'lerde ORDER BY CAST(a1 AS integer) + CAST(a2 AS integer) +
> CAST(a6 AS integer) DESC gibisinden bir sekilde idare ettim (TRUE
> olmasini aradigim kolonlari ORDER BY'a ekleyerek), fakat veri
> buyuklugu acisindan production seviyesinde bu sekilde kullanilmasi
> imkansiz.
>
> Yapmak istedigim sey, 2 tane bitstring'i AND'ledikten sonra, sonuc
> bitstring'inde kac adet 1 oldugunu almak, ve buna gore siralama yapmak
> (ayni zamanda bu degeri de ogrenmek tabi ki), ozetle 0011110101 icin 5
> dondurecek bir fonksiyon.

Evvela integer/boolean ile uğraşmaktan vazgeçip PostgreSQL size
sunduğu bit(n) veri tipine bir böz atın. Ardından gerekli bitwise
operatörleri kullanarak istediğiniz kolaylıkla yapabilirsiniz. (Bu
konuda olmazsa ben yine yardımcı olurum.)

Ama bence bir şeyleri yanlış yapıyor gibisiniz. Bitwise veri saklayıp
işlemeyi ben de çok severim ama düşünüyorum da... bitwise veri
içindeki birlerin sayısı bana burada yanlış bir kullanım yer olduğunu
çağrıştırıyor. Tam olarak ne yapmaya çalışıyorsunuz? Bu 300 tane flag
ne tür veriler içeriyor. Bunu biraz daha açarsanız sevinirim. Eldeki
bilgiler ile düşünüyorum da... Verinin çok daha mantıklı bir
katagorizasyonu mümkün olmalı.

> bunun en ideal yolu nedir, pgSQL ile bir fonksiyon yazmak pek verimli
> olmaz gibi gorundu, c ile fonksiyon mu eklemeli (gordugum kadariyla
> cok karmasik bir APIsi yok postgresql'in, yine de gozatmaktan oteye
> gecmedim, belki bitstringler degil ama, 32 bitlik integerlarla calisan
> bir fonksiyon ekleyip, veritabanimi buna gore olusturabilirim 10 adet
> 32 bitlik integer'da tutacak gibi), indekslere guvenip su anki haliyle
> mi birakmali (cok fazla sayida kolon oldugu icin pek verimli olmaz
> diye dusunuyorum), hazir boyle bir sey var midir, ya da baska
> onerileriniz bu ihtiyaca yonelik?

Dediğim gibi, önce bir asıl problemi görelim. Bu noktada yapılacak
yardımlar, sizin yanlış tasarımınız üzerinde doğru adımlar atmaya
çalışmak gibi olacaktır. Onun yerine baştan verileri düzgün bir
tasarım içinde tablolarda saklamanın daha sağlıklı olacağı aşikar
gözüküyor bence.

İyi çalışmalar.

In response to

Responses

Browse pgsql-tr-genel by date

  From Date Subject
Next Message Kerem Hadimli 2006-12-04 16:08:41 Re: bitstring ya da numerik tur uzerinde "bit count" alabilmek
Previous Message Kerem Hadimli 2006-12-04 14:27:30 bitstring ya da numerik tur uzerinde "bit count" alabilmek