Реализация иерархической структуры в sqlite - PullRequest
0 голосов
/ 14 апреля 2019

Я новичок в SQL, я пишу приложение на C # с использованием SQLite.Мне нужна помощь в реализации иерархической структуры, показанной здесь https://imgur.com/a/NImUPCc в моей базе данных.Я знаю, что с частными учетными записями это будет таблица с именем PrivateAccounts (должна была бы называться PersonalAccounts, а не private, но сейчас это не имеет большого значения), и там я бы бросил много строк с идентификаторами, логинами и т. Д. Однако как это сделатьэто с учетными записями компании, где есть общая учетная запись для компании, и к этой учетной записи мне нужно связать учетные записи людей, работающих в этой компании?Будет ли эффективно создать таблицу для каждой компании?Тем не менее, это может привести к большим ошибкам в базе данных, поскольку я хотел бы иметь одну базу данных для учетных записей компании и личных учетных записей, если это возможно

1 Ответ

0 голосов
/ 15 апреля 2019

Я бы предложил 3 таблицы.

Таблица Entity , в которой хранится информация о владельцах аккаунта (и для учета субкомпаний с использованием ссылки на владелец) и столбец для типа (частное лицо или компания).

Таблица Account , в которой есть имя и владелец учетной записи.

Таблица Транзакция счета для записи транзакций, в основном два столбца, один из которых ссылается на счет (и, следовательно, на сущность) и сумму транзакции.

Выше приведено довольно просто, и вы, вероятно, захотите добавить больше столбцов.

Пример

Ниже приведена краткая демонстрация, которая завершается балансом счетов с указанием имени учетной записи, имени прямого владельца и типа отображаемой учетной записи.

DROP TABLE IF EXISTS entity;
DROP TABLE IF EXISTS account;
DROP TABLE IF EXISTS account_transaction;
CREATE TABLE IF NOT EXISTS entity (id INTEGER PRIMARY KEY, entity_name TEXT, entity_type INTEGER, entity_owning_entity);
CREATE TABLE IF NOT EXISTS account (id INTEGER PRIMARY KEY, account_name TEXT, entity_reference INTEGER);
CREATE TABLE IF NOT EXISTS account_transaction (id INTEGER PRIMARY KEY, account_reference INTEGER, amount REAL);
INSERT INTO entity (entity_name, entity_type, entity_owning_entity)
    VALUES
        ("Company 1",1,null), -- will be id 1 
        ("Company 2",1, null), -- will be id 2
      ("Sub Company A",1,1), -- Owned by Company 1 will be id 3
        ("Sub Company B",1,1), -- Owned by Company 1 will be id 4
        ("Sub Company X",1,2), -- Owned by Company 2 will be id 5
        ("Sub Company Y",1,2), -- Owned by Company 2 will be id 6
        ("Fred",0,null), -- Not owned personal type (0) will be id 7
        ("Mary",0,null) -- Not owned, personal type, will be id 8
;
INSERT INTO account (account_name, entity_reference)
    VALUES
        ("Fred's Cheque",7), -- id 1
        ("Sub A Cheque",3), -- id 2
        ("Fred's Savings",7), -- id 3
        ("Mary's Cheque",8), -- id 4
      ("Sub X Chequ",5) -- id 5
;

INSERT INTO account_transaction (account_reference, amount)
    VALUES
        (3,123.45),(3,57.55),(3,200), -- 381 for Fred's Cheque (i.e. references id 3 in the account table)
        (2,100),(2,100),(2,100),(2,100), -- 400 for Sub A Cheque (i.e. references id 2)
        (1,10),
        (4,15),(4,15),(4,30),
        (5,13),(5,14),(5,15),(5,16),(5,17)
;

WITH cte1(id,name) AS 
  -- Use Common Table Expression (temp table) to resolve owner of an entity
    (SELECT id, (SELECT entity_name FROM entity WHERE me.entity_owning_entity = id) FROM entity AS me)

-- Main SELECT Query
SELECT
  -- Handle case when no entity owner or when entity owner
  CASE
        WHEN (SELECT name FROM cte1 where cte1.id = entity.id) IS NULL 
            THEN entity_name
            ELSE (SELECT name FROM cte1 where cte1.id = entity.id)||'-'||entity_name
    END AS AccountOwner,
    account_name AS Account, -- Show the axccount_name
    sum(amount) AS Balance,  -- Show the balance
    -- Use and appropriate value for the type (private or company account)
    CASE
            WHEN entity_type = 1 THEN 'Company'
            WHEN entity_type = 0 THEN 'Private'
        END AS Type
FROM account_transaction -- main table
    JOIN account ON account.id = account_reference -- relationship to the account table
    JOIN entity ON entity.id = entity_reference -- relationship to the entity table
GROUP BY account.id -- group according to accounts (i.e. 1 row is made from all rows in a group for aggregates such a sum)
ORDER BY AccountOwner -- Order result according to the Account Owner 
;

Результат

Запрос SELECT вернет: -

enter image description here

  • Обратите внимание, что вы обычно не будете делать предположения о том, что идентификаторы являются конкретными значениями, если предположить, что они используются для краткости.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...