Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

gør ikke-unike unikke

1 view
Skip to first unread message

Leif Neland

unread,
Dec 14, 2012, 8:00:20 PM12/14/12
to
Mssql 2008R2

Jeg skal lave nogle "seo-venlige" url'er.
Jeg har bl.a. to kolonner, titel, og url.
Der er et unikt index på url.

Jeg har en funktion to_seo, der fjerner "farlige" tegn.

Jeg vil undgå generelt at sætte et nr på, som man ofte ser
http://site.dom/hans_og_grete_12345

Kun ved sammenfald kan det accepteres at sætte et tal eller tilfældige
tegn efter.

Et query son
UPDATE tabel SET url=to_seo(titel)
vil jo dø, hvis der er sammenfald.

Query'et skal køre i databasen, en stored procedure, det vil tage alt
for lang tid, hvis der fra applikationen for hver enkelt record skal
spørges
findes "titel" i db?
Hvis ja, findes "titel_1"?
Hvis ja, finde "titel_2"


Idéer, tak :-)

leif

--
Husk kørelys bagpå, hvis din bilfabrikant har taget den idiotiske
beslutning at undlade det.


Arne Vajhøj

unread,
Dec 14, 2012, 8:56:56 PM12/14/12
to
On 12/14/2012 8:00 PM, Leif Neland wrote:
> Mssql 2008R2
>
> Jeg skal lave nogle "seo-venlige" url'er.
> Jeg har bl.a. to kolonner, titel, og url.
> Der er et unikt index på url.
>
> Jeg har en funktion to_seo, der fjerner "farlige" tegn.
>
> Jeg vil undgå generelt at sætte et nr på, som man ofte ser
> http://site.dom/hans_og_grete_12345
>
> Kun ved sammenfald kan det accepteres at sætte et tal eller tilfældige
> tegn efter.
>
> Et query son
> UPDATE tabel SET url=to_seo(titel)
> vil jo dø, hvis der er sammenfald.
>
> Query'et skal køre i databasen, en stored procedure, det vil tage alt
> for lang tid, hvis der fra applikationen for hver enkelt record skal
> spørges
> findes "titel" i db?
> Hvis ja, findes "titel_1"?
> Hvis ja, finde "titel_2"
>
> Idéer, tak :-)

Hvor stor en andel er der sammenfald på?

Hvis det er meget få så ville jeg bare lave:

SELECT id,titel FROM tabel
for each row {
if failing UPDATE tabel SET url=to_seo(titel) WHERE id=? {
n = 0
do {
n++
} while failing UPDATE tabel SET url=to_seo(titel)+'_'+n WHERE id=?
}
}

Hvis der er rigtigt mange sammenfald, så ville jeg droppe ideen med at
undgå og bare sætte på alle.

Hvis der er en pæn del sammenfald, så ville jeg lave:

SELECT id,titel FROM tabel ORDER BY titel
for each row {
if row.titel != lastrow.titel {
UPDATE tabel SET url=to_seo(titel) WHERE id=?
n = 1
} else {
UPDATE tabel SET url=to_seo(titel)+'_'+n WHERE id=?
n++
}
}

En SP vil spare en del roundtrips, men hvis app og db har en
hurtig forbindelse, så er jeg ikke sikker på at det er umagen
værd at lave en SP.

Arne

Leif Neland

unread,
Dec 15, 2012, 7:42:55 AM12/15/12
to
Efter mange tanker skrev Arne Vajhøj:
> On 12/14/2012 8:00 PM, Leif Neland wrote:
>> Mssql 2008R2
>>
>> Jeg skal lave nogle "seo-venlige" url'er.
>> Jeg har bl.a. to kolonner, titel, og url.
>> Der er et unikt index på url.
>>
>> Jeg har en funktion to_seo, der fjerner "farlige" tegn.
>>
>> Jeg vil undgå generelt at sætte et nr på, som man ofte ser
>> http://site.dom/hans_og_grete_12345
>>
>> Kun ved sammenfald kan det accepteres at sætte et tal eller tilfældige
>> tegn efter.
>>
>> Et query son
>> UPDATE tabel SET url=to_seo(titel)
>> vil jo dø, hvis der er sammenfald.
>>
>> Query'et skal køre i databasen, en stored procedure, det vil tage alt
>> for lang tid, hvis der fra applikationen for hver enkelt record skal
>> spørges
>> findes "titel" i db?
>> Hvis ja, findes "titel_1"?
>> Hvis ja, finde "titel_2"
>>
>> Idéer, tak :-)
>
> Hvor stor en andel er der sammenfald på?

Ud af knap 70000 er der 1400 sammenfald
>
> Hvis det er meget få så ville jeg bare lave:
>
> SELECT id,titel FROM tabel
> for each row {
> if failing UPDATE tabel SET url=to_seo(titel) WHERE id=? {
> n = 0
> do {
> n++
> } while failing UPDATE tabel SET url=to_seo(titel)+'_'+n WHERE id=?
> }
> }
>
Øv, jeg troede lige det var en smart og valid syntax i en sp, men jeg
kan søreme ikke google "If failing UPDATE"

Der kunne jo være noget, jeg ikke havde hørt om før.

Jeg tror jeg vil lave noget som
-- giv alle en unik seo-uvenlig url
UPDATE tabel SET url='?prodid='+cast(id as nvarchar(8);

DECLARE @n integer = 0;
DECLARE @pf nvarchar(5) = ''; -- postfix for at gøre url unik

WHILE @n<10 AND EXISTS (SELECT id FROM tabel WHERE url LIKE '?prodid=')
BEGIN
UPDATE tabel SET url=to_seo(titel+@pf)
WHERE NOT EXISTS (SELECT id FROM tabel WHERE url=to_seo(titel));

SET @n=@n+1;
SET @pf='_'+cast(n AS NVARCHAR(4));
END

Det har foreløbig kørt i 5 minutter, og den er sat til at stoppe efter
første løkke...

Men det er jo kun første gang at alle skal "seo'es".

Ellers er det kun det enkelte nye produkt, der skal seo'es; det kan
ikke tage så lang tid...

Leif

Arne Vajhøj

unread,
Dec 15, 2012, 9:00:58 AM12/15/12
to
On 12/15/2012 7:42 AM, Leif Neland wrote:
> Efter mange tanker skrev Arne Vajhøj:

Ikke så mange tanker.

:-)

>> On 12/14/2012 8:00 PM, Leif Neland wrote:
>>> Mssql 2008R2
>>>
>>> Jeg skal lave nogle "seo-venlige" url'er.
>>> Jeg har bl.a. to kolonner, titel, og url.
>>> Der er et unikt index på url.
>>>
>>> Jeg har en funktion to_seo, der fjerner "farlige" tegn.
>>>
>>> Jeg vil undgå generelt at sætte et nr på, som man ofte ser
>>> http://site.dom/hans_og_grete_12345
>>>
>>> Kun ved sammenfald kan det accepteres at sætte et tal eller tilfældige
>>> tegn efter.
>>>
>>> Et query son
>>> UPDATE tabel SET url=to_seo(titel)
>>> vil jo dø, hvis der er sammenfald.
>>>
>>> Query'et skal køre i databasen, en stored procedure, det vil tage alt
>>> for lang tid, hvis der fra applikationen for hver enkelt record skal
>>> spørges
>>> findes "titel" i db?
>>> Hvis ja, findes "titel_1"?
>>> Hvis ja, finde "titel_2"
>>>
>>> Idéer, tak :-)
>>
>> Hvor stor en andel er der sammenfald på?
>
> Ud af knap 70000 er der 1400 sammenfald

Det er nok for mange til at jeg ville bruge try and catch error
modellen.

>> Hvis det er meget få så ville jeg bare lave:
>>
>> SELECT id,titel FROM tabel
>> for each row {
>> if failing UPDATE tabel SET url=to_seo(titel) WHERE id=? {
>> n = 0
>> do {
>> n++
>> } while failing UPDATE tabel SET url=to_seo(titel)+'_'+n
>> WHERE id=?
>> }
>> }
>>
> Øv, jeg troede lige det var en smart og valid syntax i en sp, men jeg
> kan søreme ikke google "If failing UPDATE"
>
> Der kunne jo være noget, jeg ikke havde hørt om før.

Pseudo kode.

:-)

Men T-SQL i 2008 R2 har faktisk TRY CATCH!!

> Jeg tror jeg vil lave noget som
> -- giv alle en unik seo-uvenlig url
> UPDATE tabel SET url='?prodid='+cast(id as nvarchar(8);
>
> DECLARE @n integer = 0;
> DECLARE @pf nvarchar(5) = ''; -- postfix for at gøre url unik
>
> WHILE @n<10 AND EXISTS (SELECT id FROM tabel WHERE url LIKE '?prodid=')
> BEGIN
> UPDATE tabel SET url=to_seo(titel+@pf)
> WHERE NOT EXISTS (SELECT id FROM tabel WHERE url=to_seo(titel));
>
> SET @n=@n+1;
> SET @pf='_'+cast(n AS NVARCHAR(4));
> END
>
> Det har foreløbig kørt i 5 minutter, og den er sat til at stoppe efter
> første løkke...
>
> Men det er jo kun første gang at alle skal "seo'es".
>
> Ellers er det kun det enkelte nye produkt, der skal seo'es; det kan ikke
> tage så lang tid...

Den SQL forstaar jeg slet ikke.

Arne


Leif Neland

unread,
Dec 15, 2012, 10:39:10 AM12/15/12
to
Arne Vajhøj har bragt dette til os:
hvis index.php på webserveren ser
http://mit.site/?prodid=123 behandles af index.php og der hentes
produkt 123 direkte.
Ellers rewriter webserveren
http://mit.site/hest til
http://mit.site/index.php?q=hest
hvorefter der hentes produktet, hvor url-feltet er hest

Først sættes url til "?prodid="+id, den ikke seo-optimerede url.

Du får lige den ikke-obfuskerede udgave af inderløkken, der ikke
virker:


UPDATE t_produkter SET seourl=dbo.to_seo(titel)
WHERE NOT EXISTS (
SELECT id FROM t_produkter p1
WHERE p1.seourl=dbo.to_seo(t_produkter.titel)
);

Jeg ville kun indsætte de url'er der ikke findes i forvejen.
I næste omgang ville jeg så indsætte de titel_1 som ikke findes i
forvejen, for de rækker der stadig havde en 'prodid=%' url.
Næste omgang skulle så tage de der ikke var blevet seo'et endnu og give
dem titel_2 som url.
Osv.

Men where-kriteriet bliver åbenbart beregnet først, og tager sig ikke
af ændringer i tabellen undervejs.

Altså, har jeg to rækker med titel 'hest', bliver de begge udvalgt til
"SET seourl='hest'" fordi der når where bliver udført, ikke er nogen
rækker med seourl='hest' endnu.

Så jeg må lave en funktion, der tager en enkelt række; den skal
alligevel bruges, når jeg skal have nye records ind.

Hvis det er tungt at 'seo-ficere' linkene, kan jeg jo sætte websiden
til at lave et par records i slutningen af hver sidevisning; det gør jo
ikke noget at der linkes til /?prodid=123, selvom siden også kan findes
som /hest.

Arne Vajhøj

unread,
Dec 15, 2012, 2:31:22 PM12/15/12
to
Jeg har stadig ikke helt forstået det.

Men hvorfor ikke bruge min "mellem" løsning?

Arne


0 new messages