El mundo de las bases de datos ha sido capturado por DBMS relacionales que usan el lenguaje SQL. Tanto es así que las especies emergentes se llaman NoSQL. Se las arreglaron para ocupar cierto lugar en este mercado, pero los DBMS relacionales no van a morir, y continúan utilizándose activamente para sus fines.
En este artículo quiero describir el concepto de una base de datos funcional. Para una mejor comprensión, haré esto comparándolo con el modelo relacional clásico. Como ejemplos, se utilizarán tareas de varias pruebas SQL encontradas en Internet.
Introduccion
Las bases de datos relacionales operan en tablas y campos. En la base de datos funcional, se utilizarán clases y funciones en su lugar. Se presentará un campo en una tabla con N teclas en función de N parámetros. En lugar de relaciones entre tablas, se utilizarán funciones que devuelven objetos de la clase que se está vinculando. En lugar de la función JOIN se utilizará la composición.
Antes de continuar directamente con las tareas, describiré la tarea de la lógica de dominio. Para DDL, usaré la sintaxis de PostgreSQL. Para funcional, su propia sintaxis.
Tablas y Campos
Objeto Sku simple con nombre de campo y precio:
RelacionalCREATE TABLE Sku
(
id bigint NOT NULL,
name character varying(100),
price numeric(10,5),
CONSTRAINT id_pkey PRIMARY KEY (id)
)
, Sku, .
, , , .
/ / . , . , :
CREATE TABLE prices
(
skuId bigint NOT NULL,
storeId bigint NOT NULL,
supplierId bigint NOT NULL,
dateTime timestamp without time zone,
price numeric(10,5),
CONSTRAINT prices_pkey PRIMARY KEY (skuId, storeId, supplierId)
)
, .
CREATE INDEX prices_date
ON prices
(skuId, storeId, supplierId, dateTime)
,
.
( ).
1.1
, .
select a.*
from employee a, employee b
where b.id = a.chief_id
and a.salary > b.salary
1.2
,
select a.*
from employee a
where a.salary = ( select max(salary) from employee b
where b.department_id = a.department_id )
. CREATE VIEW, . , .
1.3
ID , 3 .
select department_id
from employee
group by department_id
having count(*) <= 3
1.4
, , - .
select a.*
from employee a
left join employee b on (b.id = a.chief_id and b.department_id = a.department_id)
where b.id is null
1.5
ID .
with sum_salary as
( select department_id, sum(salary) salary
from employee
group by department_id )
select department_id
from sum_salary a
where a.salary = ( select max(salary) from sum_salary )
. , MS SQL.
2.1
1997 30 №1?
( ):
select LastName
from Employees as e
where (
select sum(od.Quantity)
from [Order Details] as od
where od.ProductID = 1 and od.OrderID in (
select o.OrderID
from Orders as o
where year(o.OrderDate) = 1997 and e.EmployeeID = o.EmployeeID)
) > 30
2.2
(, ) (), 1997- .
:
SELECT ContactName, ProductName FROM (
SELECT c.ContactName, p.ProductName
, ROW_NUMBER() OVER (
PARTITION BY c.ContactName
ORDER BY SUM(od.Quantity * od.UnitPrice * (1 - od.Discount)) DESC
) AS RatingByAmt
FROM Customers c
JOIN Orders o ON o.CustomerID = c.CustomerID
JOIN [Order Details] od ON od.OrderID = o.OrderID
JOIN Products p ON p.ProductID = od.ProductID
WHERE YEAR(o.OrderDate) = 1997
GROUP BY c.ContactName, p.ProductName
) t
WHERE RatingByAmt < 3
PARTITION : , SUM ( 1), ( Customer Year, ), , ORDER ( bought, , ).
2.3
.
:
select s.CompanyName, p.ProductName, sum(od.Quantity) + p.ReorderLevel — p.UnitsInStock as ToOrder
from Orders o
join [Order Details] od on o.OrderID = od.OrderID
join Products p on od.ProductID = p.ProductID
join Suppliers s on p.SupplierID = s.SupplierID
where o.ShippedDate is null
group by s.CompanyName, p.ProductName, p.UnitsInStock, p.ReorderLevel
having p.UnitsInStock < sum(od.Quantity) + p.ReorderLevel
. . . :
. A, B, C , A B, B C, A C, A C.
:
SQL. , , . . . . :
UPD:
dss_kalika:
SELECT
pl.PersonAID
,pf.PersonAID
,pff.PersonAID
FROM Persons AS p
--
JOIN PersonRelationShip AS pl ON pl.PersonAID = p.PersonID
AND pl.Relation = 'Like'
--
JOIN PersonRelationShip AS pf ON pf.PersonAID = p.PersonID
AND pf.Relation = 'Friend'
--
JOIN PersonRelationShip AS pff ON pff.PersonAID = pf.PersonBID
AND pff.PersonBID = pl.PersonBID
AND pff.Relation = 'Friend'
--
LEFT JOIN PersonRelationShip AS pnf ON pnf.PersonAID = p.PersonID
AND pnf.PersonBID = pff.PersonBID
AND pnf.Relation = 'Friend'
WHERE pnf.PersonAID IS NULL
;WITH PersonRelationShipCollapsed AS (
SELECT pl.PersonAID
,pl.PersonBID
,pl.Relation
FROM #PersonRelationShip AS pl
UNION
SELECT pl.PersonBID AS PersonAID
,pl.PersonAID AS PersonBID
,pl.Relation
FROM #PersonRelationShip AS pl
)
SELECT
pl.PersonAID
,pf.PersonBID
,pff.PersonBID
FROM #Persons AS p
--
JOIN PersonRelationShipCollapsed AS pl ON pl.PersonAID = p.PersonID
AND pl.Relation = 'Like'
--
JOIN PersonRelationShipCollapsed AS pf ON pf.PersonAID = p.PersonID
AND pf.Relation = 'Friend'
--
JOIN PersonRelationShipCollapsed AS pff ON pff.PersonAID = pf.PersonBID
AND pff.PersonBID = pl.PersonBID
AND pff.Relation = 'Friend'
--
LEFT JOIN PersonRelationShipCollapsed AS pnf ON pnf.PersonAID = p.PersonID
AND pnf.PersonBID = pff.PersonBID
AND pnf.Relation = 'Friend'
WHERE pnf.[PersonAID] IS NULL
, — . SQL, , . , - , . — . C++, Python .
, :
- . , . (, ), , , .
- . (, sold, bought ..), . . , , sold , . , CREATE VIEW. , .
- . ( ). , ( , — , ). , «» . , . , :
- . CLASS ClassP: Class1, Class2 . , .
, , Java, . ,
. , ( PostgreSQL) « ». , , . , , , .