ΠΡΠΎ ΠΊΠ»Π°ΡΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π²ΠΎΠΏΡΠΎΡ ΠΊΠΎΠΌΠΏΡΠΎΠΌΠΈΡΡΠ° (trade-off) ΠΌΠ΅ΠΆΠ΄Ρ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠ΅ΠΉ ΠΌΠ°ΡΠΈΠ½Π½ΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ ΠΈ ΡΠ΄ΠΎΠ±ΡΡΠ²ΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ (Developer Experience / Analytics). Π’Ρ ΠΌΡΡΠ»ΠΈΡΡ Π°Π±ΡΠΎΠ»ΡΡΠ½ΠΎ ΠΊΠ°ΠΊ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΡΠ°Ρ ΠΌΠ°ΡΠ½ΡΡ Π΄Π²ΠΈΠΆΠΊΠΎΠ², ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΠ°ΠΌ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡΡΡ Π±ΠΈΡΠΎΠ²ΡΠ΅ ΠΌΠ°ΡΠΊΠΈ ΠΈ ΡΠΈΡΠ»Π°!
ΠΠ°Π²Π°ΠΉ ΡΠ°Π·Π±Π΅ΡΠ΅ΠΌ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠΈΠΏ Π΄Π°Π½Π½ΡΡ ΠΏΠΎ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΡΡΠΈ, ΠΏΠ»ΡΡΡ ΠΈ ΠΌΠΈΠ½ΡΡΡ ΠΎΠ±ΠΎΠΈΡ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΎΠ².
1. active_color: Π‘ΠΈΠΌΠ²ΠΎΠ» (βwβ/βbβ) vs ΠΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ (Boolean)
ΠΡΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Boolean (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, is_white = true):
- ΠΠ»ΡΡΡ: Π‘Π°ΠΌΡΠΉ ΡΡΡΠΎΠ³ΠΈΠΉ ΡΠΈΠΏ Π΄Π°Π½Π½ΡΡ
. ΠΠ΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΠΈΡΠ°ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΊΡ Π²ΡΠΎΠ΄Π΅
'x'. - ΠΠΈΠ½ΡΡΡ: Π Π±Π°Π·Π°Ρ
Π΄Π°Π½Π½ΡΡ
(ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ PostgreSQL) Boolean Π²ΡΡ ΡΠ°Π²Π½ΠΎ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ 1 Π±Π°ΠΉΡ ΡΠΈΠ·ΠΈΡΠ΅ΡΠΊΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ (ΠΈΠ·-Π·Π° Π²ΡΡΠ°Π²Π½ΠΈΠ²Π°Π½ΠΈΡ ΡΡΡΠ°Π½ΠΈΡ). ΠΠΊΠΎΠ½ΠΎΠΌΠΈΠΈ ΠΌΠ΅ΡΡΠ° Π½Π΅Ρ. ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, ΠΏΡΠΈ ΡΡΠ΅Π½ΠΈΠΈ ΠΈΠ»ΠΈ ΠΎΡΠ»Π°Π΄ΠΊΠ΅ ΡΡΡΡΡ
Π΄Π°Π½Π½ΡΡ
Π² SQL-ΠΊΠΎΠ½ΡΠΎΠ»ΠΈ Π½ΡΠΆΠ½ΠΎ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎ Π΄Π΅ΡΠΆΠ°ΡΡ Π² Π³ΠΎΠ»ΠΎΠ²Π΅:
trueβ ΡΡΠΎ Π±Π΅Π»ΡΠ΅ ΠΈΠ»ΠΈ ΡΠ΅ΡΠ½ΡΠ΅? - ΠΡΠ²ΠΎΠ΄: Π‘ΠΈΠΌΠ²ΠΎΠ»
CHAR(1)Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ΠΌ (CHECKactive_color IN ('w', 'b')) Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ ΡΠΎΡ ΠΆΠ΅ 1 Π±Π°ΠΉΡ, Π½ΠΎ ΠΏΡΠΈ ΡΡΠΎΠΌ Π΄Π°Π½Π½ΡΠ΅ ΡΠ°ΠΌΠΎΠ΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΈΡΡΠ΅ΠΌΡΠ΅. ΠΡ ΡΡΠ°Π·Ρ Π²ΠΈΠ΄ΠΈΠΌ βwβ ΠΈ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅ΠΌ, ΡΠ΅ΠΉ Ρ ΠΎΠ΄.
2. castling: Π‘ΡΡΠΎΠΊΠ° (βKQkqβ) vs Π§ΠΈΡΠ»ΠΎ (ΠΠΈΡΠΎΠ²Π°Ρ ΠΌΠ°ΡΠΊΠ°)
Π£ Π½Π°Ρ 4 Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΡ
ΠΏΡΠ°Π²Π° ΡΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ (ΠΠ΅Π»ΡΠΉ ΠΠΎΡΠΎΠ»Ρ, ΠΠ΅Π»Π°Ρ ΠΠΎΡΠΎΠ»Π΅Π²Π°, Π§Π΅ΡΠ½ΡΠΉ ΠΠΎΡΠΎΠ»Ρ, Π§Π΅ΡΠ½Π°Ρ ΠΠΎΡΠΎΠ»Π΅Π²Π°).
ΠΡΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π§ΠΈΡΠ»ΠΎ (Π±ΠΈΡΠΎΠ²ΡΡ ΠΌΠ°ΡΠΊΡ ΠΎΡ 0 Π΄ΠΎ 15):
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, 1-ΠΉ Π±ΠΈΡ β K, 2-ΠΉ β Q, 3-ΠΉ β k, 4-ΠΉ β q.
Π§ΠΈΡΠ»ΠΎ 15 Π² Π±ΠΈΠ½Π°ΡΠ½ΠΎΠΌ Π²ΠΈΠ΄Π΅ 1111 ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ KQkq. Π§ΠΈΡΠ»ΠΎ 5 (0101) ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ Kk.
- ΠΠ»ΡΡΡ: ΠΠ΄Π΅Π°Π»ΡΠ½ΠΎ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ ΡΠ°Ρ
ΠΌΠ°ΡΠ½ΠΎΠ³ΠΎ Π΄Π²ΠΈΠΆΠΊΠ°. ΠΡΠ΅Π½Ρ Π±ΡΡΡΡΠΎ ΡΡΠΈΡΠ°ΡΡ Π² ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ΅ ΡΠ΅ΡΠ΅Π· ΠΏΠΎΠ±ΠΈΡΠΎΠ²ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ (
AND,OR). - ΠΠΈΠ½ΡΡΡ: ΠΡΠ»ΠΈ Π°Π½Π°Π»ΠΈΡΠΈΠΊΡ (ΠΈΠ»ΠΈ ΡΠ΅Π±Π΅ ΡΠ΅ΡΠ΅Π· ΠΏΠ°ΡΡ Π»Π΅Ρ) Π·Π°Ρ
ΠΎΡΠ΅ΡΡΡ Π½Π°ΠΉΡΠΈ ΠΏΠ°ΡΡΠΈΠΈ, Π³Π΄Π΅ Π±Π΅Π»ΡΠ΅ ΠΌΠΎΠ³Π»ΠΈ ΡΠ΄Π΅Π»Π°ΡΡ Π΄Π»ΠΈΠ½Π½ΡΡ ΡΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ, Π΅ΠΌΡ ΠΏΡΠΈΠ΄Π΅ΡΡΡ ΠΏΠΈΡΠ°ΡΡ SQL-Π·Π°ΠΏΡΠΎΡ Ρ ΠΏΠΎΠ±ΠΈΡΠΎΠ²ΡΠΌΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ°ΠΌΠΈ:
SELECT * FROM positions WHERE (castling_mask & 2) > 0. ΠΡΠΎ ΡΠ»ΠΎΠΆΠ½ΠΎ ΡΠΈΡΠ°ΡΡ, ΡΠ»ΠΎΠΆΠ½ΠΎ Π΄Π΅Π±Π°ΠΆΠΈΡΡ ΠΈ Π»Π΅Π³ΠΊΠΎ ΠΎΡΠΈΠ±ΠΈΡΡΡΡ. - ΠΡΠ²ΠΎΠ΄: Π Π±Π°Π·Π΅ Π΄Π°Π½Π½ΡΡ
ΠΌΡ ΡΠ°ΡΠ΅ Π²ΡΠ±ΠΈΡΠ°Π΅ΠΌ ΡΡΡΠΎΠΊΡ.
VARCHAR(4)Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ Π²ΡΠ΅Π³ΠΎ ΠΎΠΊΠΎΠ»ΠΎ 5 Π±Π°ΠΉΡ. ΠΠ°ΠΏΡΠΎΡWHERE castling LIKE '%Q%'Π³ΠΎΡΠ°Π·Π΄ΠΎ ΠΏΠΎΠ½ΡΡΠ½Π΅Π΅ Π΄Π»Ρ ΡΠ΅Π»ΠΎΠ²Π΅ΠΊΠ°.
3. en_passant: Π‘ΡΡΠΎΠΊΠ° (βa3c3e3β) vs ΠΠΈΡΠΎΠ²Π°Ρ ΠΌΠ°ΡΠΊΠ° (Bitboard)
ΠΡΠΎ ΡΠ°ΠΌΡΠΉ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΠΉ ΡΠ»ΡΡΠ°ΠΉ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π² Dice Chess Ρ Π½Π°Ρ Π±ΡΠ²Π°Π΅Ρ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π΅Π½Π½ΡΠΉ en_passant. Π ΠΊΠ»Π°ΡΡΠΈΡΠ΅ΡΠΊΠΈΡ ΡΠ°Ρ ΠΌΠ°ΡΠ°Ρ ΠΏΠΎΠ»Π΅ ΠΎΠ΄Π½ΠΎ, ΠΈ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ Π±Ρ ΡΠΎΡ ΡΠ°Π½ΠΈΡΡ ΠΊΠ°ΠΊ ΡΠΈΡΠ»ΠΎ ΠΎΡ 0 Π΄ΠΎ 63 (ΠΈΠ½Π΄Π΅ΠΊΡ ΠΊΠ»Π΅ΡΠΊΠΈ). Π Dice Chess ΡΠ°ΠΊ Π½Π΅ ΠΏΠΎΠ»ΡΡΠΈΡΡΡ.
ΠΡΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π§ΠΈΡΠ»ΠΎ (64-Π±ΠΈΡΠ½ΡΠΉ Bitboard):
ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ 64-Π±ΠΈΡΠ½ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ (BIGINT), Π³Π΄Π΅ ΠΊΠ°ΠΆΠ΄ΡΠΉ Π±ΠΈΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ ΠΊΠ»Π΅ΡΠΊΠ΅ Π½Π° Π΄ΠΎΡΠΊΠ΅. ΠΡΠ»ΠΈ 3-ΠΉ Π±ΠΈΡ Π²ΠΊΠ»ΡΡΠ΅Π½, Π·Π½Π°ΡΠΈΡ Π±ΠΈΡΡ ΠΌΠΎΠΆΠ½ΠΎ Π½Π° c3.
- ΠΠ»ΡΡΡ: Π‘ ΡΠΎΡΠΊΠΈ Π·ΡΠ΅Π½ΠΈΡ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ , Ρ ΡΠ°Π½ΠΈΡΡ 64-Π±ΠΈΡΠ½ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ β ΡΡΠΎ 8 Π±Π°ΠΉΡ ΠΏΠ°ΠΌΡΡΠΈ.
- ΠΠΈΠ½ΡΡΡ: Π‘ΡΡΠΎΠΊΠ°
a3c3e3ΡΠΎΠΆΠ΅ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ Π²ΡΠ΅Π³ΠΎ 7 Π±Π°ΠΉΡ (ΠΏΠ»ΡΡ Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠΉ ΠΎΠ²Π΅ΡΡ Π΅Π΄ Postgres Π½Π°VARCHAR)! Π’ΠΎ Π΅ΡΡΡ Π²ΡΠΈΠ³ΡΡΡ Π² ΠΏΠ°ΠΌΡΡΠΈ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π½ΡΠ»Π΅Π²ΠΎΠΉ. Π Π²ΠΎΡ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΡ SQL-Π·Π°ΠΏΡΠΎΡΠΎΠ² Π²Π·Π»Π΅ΡΠ°Π΅Ρ Π΄ΠΎ Π½Π΅Π±Π΅Ρ. ΠΠ°ΠΊ Π½Π°ΠΉΡΠΈ ΠΏΠΎΠ·ΠΈΡΠΈΠΈ, Π³Π΄Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ±ΠΈΡΡ ΠΏΠ΅ΡΠΊΡ Π½Π° Π»ΠΈΠ½ΠΈΠΈ βeβ? Π‘ Π±ΠΈΡΠ±ΠΎΡΠ΄ΠΎΠΌ ΡΡΠΎ ΡΠ»ΠΎΠΆΠ½Π°Ρ ΠΌΠ°ΡΠ΅ΠΌΠ°ΡΠΈΠΊΠ°. Π‘ΠΎ ΡΡΡΠΎΠΊΠΎΠΉ:WHERE en_passant LIKE '%e%'.
ΠΠ±ΡΠΈΠΉ Π²ΡΠ²ΠΎΠ΄ ΠΏΠΎ Trade-off
Π ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ΅ Π΅ΡΡΡ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ: ΠΠ²ΠΈΠΆΠΎΠΊ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°Π½ Π΄Π»Ρ ΠΌΠ°ΡΠΈΠ½Ρ, Π° ΠΠ°Π·Π° Π΄Π°Π½Π½ΡΡ β Π΄Π»Ρ ΡΠ΅Π»ΠΎΠ²Π΅ΠΊΠ° (Π°Π½Π°Π»ΠΈΡΠΈΠΊΠ°).
- Π Π΄Π²ΠΈΠΆΠΊΠ΅ Scala (Π³Π΄Π΅ ΠΊΠ°ΠΆΠ΄Π°Ρ ΠΌΠΈΠΊΡΠΎΡΠ΅ΠΊΡΠ½Π΄Π° Π½Π° ΡΡΠ΅ΡΡ) ΠΌΡ ΠΎΠ±ΡΠ·Π°Π½Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠΈΡΠ»Π°, Π±ΠΈΡΠΎΠ²ΡΠ΅ ΠΌΠ°ΡΠΊΠΈ ΠΈ
LongΠ΄Π»Ρ Π΄ΠΎΡΠΎΠΊ (Bitboards). Π ΡΡ ΡΡΠΎ ΡΠΆΠ΅ Π΄Π΅Π»Π°Π΅ΡΡ! - Π Π±Π°Π·Π΅ Π΄Π°Π½Π½ΡΡ PostgreSQL (Π³Π΄Π΅ ΡΠ·ΠΊΠΎΠ΅ ΠΌΠ΅ΡΡΠΎ β ΡΡΠΎ Π²ΡΠ΅ΠΌΡ Π°Π½Π°Π»ΠΈΡΠΈΠΊΠ° Π½Π° Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠ΅ SQL-Π·Π°ΠΏΡΠΎΡΠΎΠ²) ΠΌΡ ΠΏΡΠ΅Π΄ΠΏΠΎΡΠΈΡΠ°Π΅ΠΌ ΡΠΈΡΠ°Π΅ΠΌΡΠ΅ ΡΡΡΠΎΠΊΠΈ. ΠΠΊΠΎΠ½ΠΎΠΌΠΈΡ 3-4 Π±Π°ΠΉΡ Π½Π° ΡΡΡΠΎΠΊΠ΅ Π½Π΅ ΡΡΠΎΠΈΡ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΠΏΡΠ΅Π²ΡΠ°ΡΠ°ΡΡ ΡΠ°Π±ΠΎΡΡ Ρ Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½ΡΡ Π² ΡΠ°ΡΡΠΈΡΡΠΎΠ²ΠΊΡ ΡΠΈΡΠ»ΠΎΠ²ΡΡ ΡΠ΅Π±ΡΡΠΎΠ².
Π’Π°ΠΊ ΡΡΠΎ Π²ΡΠ±ΡΠ°Π½Π½ΡΠ΅ ΡΡΡΠΎΠΊΠΎΠ²ΡΠ΅ ΡΠΈΠΏΡ β ΡΡΠΎ ΠΎΡΠΎΠ·Π½Π°Π½Π½ΡΠΉ ΠΊΠΎΠΌΠΏΡΠΎΠΌΠΈΡΡ Π² ΠΏΠΎΠ»ΡΠ·Ρ ΡΠΊΠΎΡΠΎΡΡΠΈ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΡ Π°Π½Π°Π»ΠΈΡΠΈΡΠ΅ΡΠΊΠΈΡ Π·Π°ΠΏΡΠΎΡΠΎΠ² ΠΈ ΡΠΈΡΠ°Π΅ΠΌΠΎΡΡΠΈ Π΄Π°Π½Π½ΡΡ ΠΏΡΠΈ Π½ΠΈΡΡΠΎΠΆΠ½ΡΡ (Π² ΡΠ°ΠΌΠΊΠ°Ρ ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΡΠ΅ΡΠ²Π΅ΡΠΎΠ²) ΠΏΠΎΡΠ΅ΡΡΡ Π΄ΠΈΡΠΊΠΎΠ²ΠΎΠ³ΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π°.